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ディレクトリを作成
mkdir hello
# 作成したディレクトリに移動
cd hello
4. 作成中のコードが依存しているモジュールをトラッキングさせる
いよいよわからない単語や文章が出てきました。
PHP における composer.json
や Ruby における Gemfile
のようなものだと思いますが、
Go 言語 では go.mod
というファイルにソースコード内で利用するモジュールを記述しておくようです。
go.mod
ファイルは、 ソースコードと一緒に Github のような ソースコードリポジトリに含めておく必要があります。
go.mod
ファイルを作成し終わったら go mod init
コマンドを実行します。
このコマンドを実行して初めて、利用する外部モジュールのトラッキングが有効となります。
コマンドの末尾には 引数 が必要です。
引数 は作成しようとしてるプログラムの名前を指定しますが、 他のアプリケーションで利用されていないようなユニークなものを指定する必要があります。
「どうしたら他のアプリケーションと重複せずにユニークになるか?」 と考えだすと難しいのですが、
「Github リポジトリを作る際のリポジトリ名を指定するものだ」 と思ってもらえば勝手にユニークになるはずです。
僕の場合だと genzouw/hello
というのが今回は良さそうです。
ではモジュールのトラッキングを有効にしていきましょう。
以下のコマンドを実行します。
$ 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
5. ソースコードの作成
ソースコードの作成に入ります。
使い慣れたテキストエディタで hello.go
というテキストファイルを作成します。
以下のソースコードを貼り付けて保存しましょう。
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
ソースコードを簡単に解説してみます。
main
パッケージを宣言。パッケージというのは関数の詰め合わせのことということです。- ここでは
main
パッケージの中に関数を一つ詰め込んでいる状態となっています。- ちなみに公式ドキュメントを見る限りだと同じパッケージは同一フォルダに格納されるようです。
fmt
パッケージパッケージをインポートします。fmt
パッケージの中に入っている関数は、「文字列を加工」したり「標準出力に出力」するためのものがあります。- 文字列加工のためということなので、頻繁にお世話になるになる関数と想像できます。
fmt
パッケージは Go をインストールした際に内包されている 標準ライブラリ と呼ばれるものの一つです。- Go 言語 をインストールした全環境で利用できます。
- 関数を実装しています。
main
関数は、今回作成したmain
パッケージをコマンドラインから実行した時に自動的に呼び出される関数です。- _Java のように
MARKDOWN_HASHfad58de7366495db4650cfefac2fcd61MARKDOWNHASH
という関数はコマンドラインのエントリポイントとなるルールなのでしょうか?このあたりはもう少し学習する必要があります。
- _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
なるほど!同一パッケージ( ブロックと書かれてはいますが... )には、同じ名前の関数は複数作れないようです。
同じディレクトリに別パッケージのファイルを配置したらどうなる?
今度は 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 の パッケージ の概念が少しわかりました。
わかってくると楽しいですね。
次回は 「外部パッケージ」を呼び出してみます 。きっとこれができるようになれば、できることの幅が一気に広がるはずです。
ディスカッション
コメント一覧
まだ、コメントがありません