go run と go buildの違い
Ruby書いているとパッケージだとか、コンパイルだとかにはほとんど無縁なので、golangの最初の最初、としてpackage・import踏まえつつ、go run と go buildの違いを整理していきます。
パッケージ(package)とは
Goでは、すべてのプログラムが何かしらのパッケージに所属している。パッケージはいわばスコープのようなもの。 原則として以下のルールが存在する。
- 1つのファイルに複数のパッケージを設定してはならない
- 1つのディレクトリに複数のパッケージをおいてはならない↲
- package mainにあるmain関数がエンドポイントとされている(ここから処理が始まる)
package main import "fmt" func main() { fmt.Printf("hello world!\n") }
コード1: hello.go
import とは
読み込む必要のあるパッケージを宣言するところ。なお、プログラムの中で使われないパッケージは自動で検出され、除いてくれと叱られる。そこらへんの厳密性をスキップしたい場合は、パッケージの左に _ (アンスコ)をつけるとスキップしてくれる。パッケージ1つだけ読み込むのであればコード1のような表記で良いが、複数ある場合は以下のようにしたほうがよい。
import ( "fmt" "testing" )
コード2
プログラムを実行する
基本的には、go run hoge.go
もしくはgo build hoge hoge.go | ./hoge
とすることで実行することができる。
go build
goはコンパイル型言語なので、CやJavaのように基本的にはコンパイルする必要がある。
go build [コンパイル後のファイル名] [コンパイルしたいファイル名]
でコンパイルし、コンパイル後のバイナリファイルを実行するには
./[コンパイル後のファイル名]
と叩くだけで良い。
なお、オプション無しでgo build
を叩くと、自動的にmainパッケージを読み込み、main関数があるファイルを特定し、そのファイル名を使ったバイナリファイルが生成される。go build
をすると、基本的にはカレントディレクトリ以下をスコープにして読み込んでコンパイルするファイルを決めるので、カレントディレクトリ以下にあるファイルが読み込まれない、といったことはない。
go run
コンパイルして実行するのがだるい、というニーズ?に答えた命令。自動的にコンパイル・実行してくれる便利なコマンド。go run hoge.go
とするだけでプログラムを実行することができる。ただ、ここで注意しておきたいのがgo build
のようにカレントディレクトリ以下の全ファイルを読み込むわけではないということです。go run hoge.go
と打つと、基本的にはimportされたパッケージだけを読み 同階層にmainパッケージに所属する別の関数などがあるとそれは無視されてしまう。