Menu
Coddy logo textTech

Go チートシート

最終更新

Hello World とプログラムの構造

すべての Go プログラムはパッケージの中にあります。エントリポイントは package main の func main です。

操作構文
パッケージ宣言package main
パッケージをインポートimport "fmt"
複数のパッケージをインポートimport (\n "fmt"\n "os"\n)
エントリポイントfunc main() { ... }
1 行を出力fmt.Println("Hello, World!")
書式付き出力fmt.Printf("%d items\n", n)
ファイルを実行go run main.go
バイナリをビルドgo build

変数と型

Go は静的型付けですが、:= で型を推論できます。

操作構文
型を指定して宣言var age int = 30
推論で宣言var name = "Ada"
短い宣言count := 0
まとめて複数x, y := 1, 2
定数const Pi = 3.14
ゼロ値0, "", false, nil
基本型int, float64, string, bool, byte, rune
型変換f := float64(i)

制御フロー

Go のループキーワードは for の 1 つだけで、条件はかっこで囲みません。

操作構文
if / elseif x > 0 { ... } else { ... }
初期化文付きの ifif v, ok := m[k]; ok { ... }
for ループ (C 風)for i := 0; i < 10; i++ { ... }
while 風のループfor x < 100 { ... }
無限ループfor { ... }
スライスを rangefor i, v := range items { ... }
switchswitch day { case 1: ...; default: ... }
式なしの switchswitch { case x > 0: ... }
break / continuebreak, continue

関数

関数は第一級の値で、複数の結果を返せます。

操作構文
基本的な関数func add(a int, b int) int { return a + b }
引数の型を共有func add(a, b int) int { ... }
複数の戻り値func divmod(a, b int) (int, int) { return a / b, a % b }
名前付きの戻り値func split(sum int) (x, y int) { x = sum / 2; return }
可変長引数の関数func sum(nums ...int) int { ... }
無名関数f := func() { ... }
クロージャfunc counter() func() int { ... }
defer (return 時に実行)defer file.Close()

スライスと配列

配列はサイズが固定で、スライスは配列に対する動的なビューです。

操作構文
固定長配列var a [3]int
スライスリテラルnums := []int{1, 2, 3}
スライスを作成s := make([]int, 0, 10)
追加s = append(s, 4)
長さ / 容量len(s), cap(s)
スライスを切り出すs[1:3]
コピーcopy(dst, src)
反復for i, v := range s { ... }

マップ

マップは Go の組み込みハッシュテーブルです。

操作構文
マップを作成m := make(map[string]int)
マップリテラルm := map[string]int{"a": 1, "b": 2}
値を設定m["c"] = 3
値を取得v := m["a"]
存在を確認v, ok := m["x"]
キーを削除delete(m, "a")
長さlen(m)
反復for k, v := range m { ... }

構造体とメソッド

構造体はフィールドをまとめ、メソッドはレシーバを介して振る舞いを付けます。

操作構文
構造体を定義type Point struct { X, Y int }
インスタンスを生成p := Point{X: 1, Y: 2}
フィールドにアクセスp.X
構造体へのポインタp := &Point{1, 2}
値レシーバのメソッドfunc (p Point) Dist() float64 { ... }
ポインタレシーバのメソッドfunc (p *Point) Move(dx int) { p.X += dx }
埋め込み構造体type Circle struct { Point; R int }
構造体タグName string にバッククォートで囲んだ json:"name" タグを付ける

インターフェース

インターフェースは暗黙的に満たされます。適切なメソッドを持つ型はどれも該当します。

操作構文
インターフェースを定義type Shape interface { Area() float64 }
実装 (暗黙)func (c Circle) Area() float64 { ... }
空インターフェース (any)var x interface{} または var x any
型アサーションs, ok := x.(string)
型 switchswitch v := x.(type) { case int: ... }
Stringer インターフェースfunc (p Point) String() string { ... }

goroutine とチャネル

goroutine は軽量なスレッドで、チャネルはそれらの間で値を受け渡します。

操作構文
goroutine を起動go doWork()
チャネルを作成ch := make(chan int)
バッファ付きチャネルch := make(chan int, 5)
チャネルに送信ch <- 42
チャネルから受信v := <-ch
チャネルを閉じるclose(ch)
チャネルを rangefor v := range ch { ... }
チャネルで selectselect { case v := <-ch: ...; default: ... }
WaitGroupvar wg sync.WaitGroup; wg.Add(1); wg.Wait()
ミューテックスvar mu sync.Mutex; mu.Lock(); mu.Unlock()

エラー処理

Go はエラーを値として返します。例外はありません。

操作構文
エラーを返すfunc read() (string, error) { return "", err }
エラーをチェックif err != nil { return err }
エラーを作成errors.New("not found")
書式付きエラーfmt.Errorf("bad id %d", id)
エラーをラップfmt.Errorf("load: %w", err)
アンラップ / 一致errors.Is(err, os.ErrNotExist)
型で一致errors.As(err, &target)
panic / recoverdefer func() { recover() }()

最もよく使う Go の構文を 1 ページにまとめました。この Go チートシートは、言語の中核のクイックリファレンスです。変数と型、スライスとマップ、構造体とインターフェース、そして Golang を並行処理で輝かせる goroutine とチャネルを収録しています。

ここに載っているものはすべて標準の Go で、公式のツールチェーンでコンパイルできます。必要なものをコピーするか、Go プレイグラウンドですべてのスニペットをその場で試してみてください。インストールは不要です。

Go チートシート よくある質問

この Go チートシートは無料ですか?
はい。この Go チートシートは完全に無料で、登録も不要です。ブックマークしておけば、スライス操作やチャネルのパターン、構造体のメソッドを調べたいときにいつでも戻ってこられます。
Go の := と var の違いは何ですか?
var x = 0 は変数を宣言し、パッケージレベルを含めてどこでも使えます。x := 0 は短い変数宣言で、宣言と代入を同時に行い、型を推論し、関数の中でしか使えません。明示的な型やパッケージレベルの変数が必要なときは var、簡潔なローカル宣言には := を使いましょう。
goroutine とチャネルとは何ですか?
goroutine は Go のランタイムが管理する軽量なスレッドで、go someFunc() と書いて起動します。チャネルは型付きのパイプで、goroutine 同士が安全に通信できます。ある goroutine が ch <- v で送り、別の goroutine が <-ch で受け取ります。両者は Go の中核となる並行モデルで、「通信によってメモリを共有せよ」という言葉に表されます。
Go をオンラインで練習できますか?
はい。Go プレイグラウンドを開けば、このチートシートのどのスニペットもブラウザ上で実行できます。Go のツールチェーンのインストールは不要です。体系的に学びたいときは、Coddy の無料インタラクティブ Go コースが、変数とスライスから goroutine、チャネルまで段階的に導いてくれます。
このチートシートは初心者に向いていますか?
はい。最もよく使うトピック (変数、制御フロー、関数) から高度なもの (goroutine、チャネル、エラー処理) へと並べてあるので、初日から上のセクションを使い、残りには慣れながら進めます。
Coddy programming languages illustration

CoddyでGoを学ぼう

始める