XGitHub

Go言語基礎

Published Icon
2024-07-28
Tag Icon

ファイル実行

以下のコードでは、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.go
main.go
package main
 
func main() {
	foo()
}
foo.go
package main
 
import "fmt"
 
func foo() {
	fmt.Println("foo")
}

これを実行するには、両方のファイル名を指定する必要があります。

go run main.go foo.go
  • パッケージ名を分ける場合

モジュール管理用ファイルのgo.modを作成する必要があります。

projectの部分はフォルダ名と違っていても大丈夫です。

go mod init project
project
 ├─ main.go
 ├─ bar
   └─ bar.go
 └─ go.mod
main.go
package main
 
import (
	"project/bar"
)
 
func main() {
	bar.Bar()
}

パッケージ名が違うので、エクスポートするには関数名の最初の文字を大文字にする必要があります。これは変数名でも一緒です。

bar/bar.go
package bar
 
import "fmt"
 
func Bar() {
	fmt.Println("Bar")
}

go.modと同じ階層で以下コマンドを実行すると動作します。

go run main.go

テスト

テスト用ファイル名はxxx_test.goのように、_testを付ける決まりがあります。

テストを行うためにもgo.modが必要なので以下コマンドで作成します。

go mod init test
project
 ├─ main.go
 ├─ main_test.go
 └─ go.mod

今回は以下のIsOneをテストします。1 が来たら true を返し、それ以外だと false を返します。

main.go
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にあるTErrorfというメソッドが実行されるとエラー扱いになります。

エラー時に表示される文言はErrorfの第一引数です。%vに渡したい値を入れることができます。

このテストは i が 1 以外だと if 文内のエラーが発生しテストに失敗します。

main_test.go
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.100s

i が 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