Go言語で “Hello, World” プログラムをコーディングしてみる
前回のエントリ で Go 言語 の実行・開発環境をセットアップできました。
いよいよコーディングしてみます。
今回は 公式ページのチュートリアル を参考にして、実際にソースコードを書きながら Go 言語 の学習を進めていこうと思います。
今回のエントリで学ぶことをさっくり箇条書き
チュートリアルで網羅しているのは以下の内容になります。
- いくつかのシンプルな "Hello, World" コード
- 作成したコードを実行するための go コマンドの使い方
- 作成したコードの中で使っているパッケージを検索するための 言語パッケージ検索ツール の使い方
- 外部モジュールで提供されている関数の呼び出し方法
前提条件・推奨条件
Go 言語 のチュートリアルを進めるにあたって、以下の事項が推奨されています。
- Go 言語 以外のプログラミング経験
- チュートリアルで記述することは非常にシンプルですが、いくつかの関数は C 言語や Java など他のプログラミング言語と同様の機能が登場します。
- 他のプログラミング言語経験したことがあれば理解が容易になります。
- 使い慣れたテキストエディタ
- 多くの適正化が Go 言語 をサポートしています。 ( 例 : VSCode、 GoLand、 Vim )
- 使い慣れたターミナル.
- 使い慣れたターミナルを使いましょう。
- Linux macOS であれば標準の Terminal を使うことも出来ます。 Windows であれば PowerShell や cmd を利用できます。
ちなみに、僕は iTerm + Vimmer を使います 。
コーディング開始!
それではいよいよ、コーディングを進めていきます。
1. ターミナルを開きます
2. ターミナルに以下のように入力します
ホームディレクトリに移動しましょう。
$ cd
Windows OS の場合には以下のコマンドを入力します。
% cd %HOMEPATH%
3. ソースコード配置ディレクトリを作成し、移動します。
hello
というディレクトリを新規に作成し、移動します。
# helloディレクトリを作成
mkdir hello
# 作成したディレクトリに移動
cd hello
4. 作成中のコードが依存しているモジュールをトラッキングさせる
いよいよわからない単語や文章が出てきました 。
PHP における composer.json
や Ruby における Gemfile
のようなものだと思いますが、
Go 言語 では go.mod
というファイルにソースコード内で利用するモジュールを記述します。
go.mod
ファイルは、 ソースコードと一緒に Github のような ソースコードリポジトリに含めておく必要があります。
go.mod
ファイルを作成するには go mod init
コマンドを実行します。go.mod
ファイルが作成されて初めて、利用する外部モジュールのトラッキングが有効となります。
go mod init
コマンドの末尾には 引数 が必要です。
引数 は作成しようとしてるモジュールの名前を指定しますが、 他のアプリケーションで利用されていないようなユニークなものを指定する必要があります。
「どうしたら他のアプリケーションと重複せずにユニークになるか?」 と考えだすと難しいのですが、
「Github リポジトリを作る際のリポジトリ名を指定するものだ」 と思ってもらえばにユニークになるはずです。
僕の場合だと genzouw/hello
というのが今回は良さそうです ( genzouw
は僕の SNS 名 ) 。
では依存モジュールのトラッキングを有効にしていきましょう。
以下のコマンドを実行します。
$ go mod init genzouw/hello
go: creating new go.mod: module genzouw/hello
コマンドの実行が終わると、 go.mod
ファイルが作成されているはずです。
$ ls go.mod
go.mod
# catコマンドでファイルの中身を確認してみる
$ cat go.mod
module genzouw/hello
go 1.16
まだ依存するモジュールを利用していないため、今回作成するモジュール ( 一旦アプリケーションだと思ってもらえれば ) と利用するには Go 言語のバージョンしか記載されていません。
5. ソースコードの作成
ソースコードの作成に入ります。
使い慣れたテキストエディタで hello.go
というテキストファイルを作成します。
以下のソースコードを貼り付けて保存しましょう。
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
ソースコードを簡単に解説してみます。
main
パッケージを宣言。パッケージというのは関数の詰め合わせのことということです。- ここでは
main
パッケージの中に関数を一つ詰め込んでいる状態となっています。- ちなみに公式ドキュメントを見る限りだと同じパッケージを使ったコードは必ず同じフォルダに格納しなければならないようです 。
fmt
パッケージパッケージをインポートします。fmt
パッケージの中に入っている関数は、「文字列を加工」したり「標準出力に出力」するためのものがあります。- 文字列加工のためということなので、頻繁にお世話になるになる関数と想像できます。
fmt
パッケージは Go をインストールした際に内包されている 標準ライブラリ と呼ばれるものの一つです。- Go 言語 をインストールした全環境で利用できます。
- 関数を実装しています。
main
関数は、今回作成したmain
パッケージをコマンドラインから実行した時に自動的に呼び出される関数です。- Java のように
main
という関数はコマンドラインのエントリポイントとなるルールなのでしょう 。
- Java のように
- 関数を実装しています。
作成した Go 言語のスクリプトを実行してみる
作成した Go 言語 のプログラムを実行してみましょう。
以下のコマンドを実行します。
$ go run .
Hello, World!
正常に実行できました!初めての "Hello, World" です!新しいプログラミング言語を学ぶときに通るいつものステップですが嬉しいですね。
他のプログラム言語では、実行コマンド( java
/ php
/ ruby
/ python
)にスクリプトファイルを指定することが多いですが、
Go 言語 では スクリプトファイルの置かれているディレクトリを指定する ようですね。
いろいろ試してみたくなる性分なので、チュートリアルから脱線して試してみる
go
コマンドに ディレクトリ ではなく ファイル を指定したらどうなる?
試しに go
コマンドにファイルを指定したらどうなるのだろう?と思って指定してみたところ、問題なく動作しました。
$ go run hello.go
Hello, World!
ディレクトリ を指定しても スクリプトファイル を指定しても、どちらでも良いみたいですね。
同じディレクトリにもう 1 ファイル、main
関数を持つスクリプトを作ったらどうなる?
今度は hello2.go
というファイルを作成してみました。
package main
import "fmt"
func main() {
fmt.Println("Hello, World2!")
}
ほぼ一緒ですね。メッセージだけ変えておきました。
実行してみます。
$ go run .
# genzouw/hello
./hello2.go:5:6: main redeclared in this block
previous declaration at ./hello.go:5:6
なるほど!同一パッケージ ( 「ブロック」と書かれてはいますが、パッケージも「ブロック」の 1 つということ? ) には、同じ名前の関数は複数作れないようです。
同じディレクトリに別パッケージのファイルを配置したらどうなる?
今度は hello2.go
の関数名を main2
にして、パッケージ名も main2
にしてみます。
package main2
import "fmt"
func main2() {
fmt.Println("Hello, World2!")
}
ほぼ一緒ですね。メッセージだけ変えておきました。
実行してみます。
$ go run .
found packages main (hello.go) and main2 (hello2.go) in /workdir
同じディレクトリに別の名前のパッケージは配置してはいけません。
go run
コマンドだけじゃない、 go
のサブコマンドたち
go run
は複数用意されている go
サブコマンドの一つです。
他のサブコマンドを表示したい場合には、以下のコマンドを実行します。
$ go help
Go is a tool for managing Go source code.
Usage:
go <command> [arguments]
The commands are:
bug start a bug report
build compile packages and dependencies
clean remove object files and cached files
doc show documentation for package or symbol
env print Go environment information
fix update packages to use new APIs
fmt gofmt (reformat) package sources
generate generate Go files by processing source
get add dependencies to current module and install them
install compile and install packages and dependencies
list list packages or modules
mod module maintenance
run compile and run Go program
test test packages
tool run specified go tool
version print Go version
vet report likely mistakes in packages
ひとこと
今日はここまでにしておきます。
Go の パッケージ の概念が少しわかりました。
わかってくると楽しいですね。
次回は 「外部パッケージ」を呼び出してみます 。
きっとこれができるようになれば、できることの幅が一気に広がるはずです。
ディスカッション
コメント一覧
まだ、コメントがありません