Go言語基礎
ファイル実行
以下のコードでは、main パッケージが宣言されており、その中の main 関数がエントリーポイントになっています。
fmtパッケージは、フォーマットされた文字列、数値などを出力します。
また入力の読み取りやフォーマットもサポートしています。
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}CAUTION
Go 言語ではpackage mainで宣言されたパッケージ内の main 関数が必ずエントリーポイントになります。そのためpackage testなどで宣言されているとエラーになります。また同一ファイル内に 2 つ以上のパッケージ宣言がある場合もエラーになります。
Go ファイルをコマンドラインで実行する
go run main.goファイル分割
- 同一パッケージ名で分割する場合
最初に宣言するpackageの名称を同じにします。今回だとmainという名称で宣言しています。
パッケージ名が同じだと、関数名の最初の文字を大文字にしなくても大丈夫です。
project
├─ main.go
└─ foo.gopackage main
func main() {
foo()
}package main
import "fmt"
func foo() {
fmt.Println("foo")
}これを実行するには、両方のファイル名を指定する必要があります。
go run main.go foo.go- パッケージ名を分ける場合
モジュール管理用ファイルのgo.modを作成する必要があります。
projectの部分はフォルダ名と違っていても大丈夫です。
go mod init projectproject
├─ main.go
├─ bar
│ └─ bar.go
└─ go.modpackage main
import (
"project/bar"
)
func main() {
bar.Bar()
}パッケージ名が違うので、エクスポートするには関数名の最初の文字を大文字にする必要があります。これは変数名でも一緒です。
package bar
import "fmt"
func Bar() {
fmt.Println("Bar")
}go.modと同じ階層で以下コマンドを実行すると動作します。
go run main.goテスト
テスト用ファイル名はxxx_test.goのように、_testを付ける決まりがあります。
テストを行うためにもgo.modが必要なので以下コマンドで作成します。
go mod init testproject
├─ main.go
├─ main_test.go
└─ go.mod今回は以下のIsOneをテストします。1 が来たら true を返し、それ以外だと false を返します。
package main
import "fmt"
func IsOne(i int) bool {
if i == 1 {
return true
} else {
return false
}
}
func main() {
fmt.Println(IsOne(1))
fmt.Println(IsOne(0))
}テストには標準パッケージのtestingを使用します。
testingにあるTのErrorfというメソッドが実行されるとエラー扱いになります。
エラー時に表示される文言はErrorfの第一引数です。%vに渡したい値を入れることができます。
このテストは i が 1 以外だと if 文内のエラーが発生しテストに失敗します。
package main
import "testing"
func TestIsOne(t *testing.T) {
i := 1
v := IsOne(i)
if !v {
t.Errorf("%v != %v", i, 1)
}
}テストを実行するには以下コマンドです。
go test成功すると、このような表示になります。
❯ go test
PASS
ok 27.test 0.100si が 0 だったらこのようなエラーが発生します。
❯ go test
--- FAIL: TestIsOne (0.00s)
main_test.go:16: 0 != 1
FAIL
exit status 1
FAIL 27.test 0.103sサブディレクトリにあるパッケージも一緒にテストするには./...を指定します。
go test ./...ビルド
- Mac
go build -o main main.go- Windows
go build -o main.exe main.go- Linux
GOOS=linux GOARCH=amd64 go build -o main main.go