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 / else | if x > 0 { ... } else { ... } |
| 初期化文付きの if | if v, ok := m[k]; ok { ... } |
| for ループ (C 風) | for i := 0; i < 10; i++ { ... } |
| while 風のループ | for x < 100 { ... } |
| 無限ループ | for { ... } |
| スライスを range | for i, v := range items { ... } |
| switch | switch day { case 1: ...; default: ... } |
| 式なしの switch | switch { case x > 0: ... } |
| break / continue | break, 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) |
| 型 switch | switch 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) |
| チャネルを range | for v := range ch { ... } |
| チャネルで select | select { case v := <-ch: ...; default: ... } |
| WaitGroup | var 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 / recover | defer 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、チャネル、エラー処理) へと並べてあるので、初日から上のセクションを使い、残りには慣れながら進めます。