PONCOTSU

インフラ領域を主にあれしてます

go run と go buildの違い

f:id:tacmac:20160919223213p:plain:h200

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パッケージに所属する別の関数などがあるとそれは無視されてしまう。