Go チートシート — クイックリファレンス
Go 1.22 の構文、型、goroutine、頻繁に使う標準ライブラリをまとめたクイックリファレンスです。日常の 80% ほどをカバーします。
Go Go 1.22
Go (gc toolchain) · コンパイル型・並行・命令型 · 静的・強い型付け・構造的型付け(インターフェース)
おすすめの学習パス
まずは go run / go build と go.mod の基本を覚え、続いて変数・型・制御フローを学びましょう。次に関数・ポインタ・構造体を深く扱い、スライスとマップでデータを整理します。インターフェースとエラー処理を理解したら、goroutine とチャネルで並行処理を書けるようになりましょう。必要に応じて http、context、時間、ビルド/テストを学んでください。落とし穴を避けるには FAQ 章を後で見返すのがおすすめです。
1.Hello World とビルド環境
Go プログラムの実行、go.mod モジュール、ツールチェーンについて説明します。
最小プログラム
すべてのプログラムは package main と func main をエントリーポイントとします。fmt で出力します。
実行とビルド
go run でコンパイルして実行、go build で実行ファイルを生成、go install で $GOBIN にインストールします。
go.mod モジュール
go.mod はモジュールパスと依存関係を宣言します。go mod init で初期化、go mod tidy で整理します。
パッケージとインポート
import で標準ライブラリとサードパーティを取り込みます。同じディレクトリのファイルは同じパッケージです。未使用のインポートはコンパイルエラーになります。
フォーマット出力
fmt.Println/Printf/Print を使用します。Printf の動詞は %s、%d、%v などです。Sprintf は文字列を返します。
引数と入力
os.Args でコマンドライン引数にアクセスし、flag で解析、fmt.Scan で入力を受け取ります。
複数ファイルプログラム
同じディレクトリの複数の .go ファイルは同じパッケージに属し、パッケージスコープを共有します。
ツールチェーン
go version でバージョン、go env で環境変数、go doc でドキュメント、go fmt でフォーマットを確認できます。
2.変数と定数
変数宣言、短変数宣言、定数、ゼロ値、型変換を扱います。
変数宣言
var で変数を宣言し、型は変数名の後に書きます。初期化するかゼロ値を与えます。
短変数宣言
:= は型推論付きで宣言と初期化を行います。関数内でのみ使用でき、左辺に少なくとも 1 つの新しい変数が必要です。
定数
const はコンパイル時に確定する定数を宣言します。iota で自動増分の列挙を定義できます。定数は任意の精度を持ちます。
ゼロ値
未初期化の変数はゼロ値を持ちます:数値は 0、文字列は空文字、bool は false、ポインタは nil です。ゼロ値はそのまま使えます。
多重代入
1 行で複数の変数に代入でき、値の交換もできます。関数の複数の戻り値も分解して受け取れます。
スコープ
ブロックスコープが基本です。関数内の変数はブロック内でのみ有効です。シャドーイングに注意してください。
型変換
T(x) で明示的に変換します。Go は数値型を暗黙的に変換しません。変換ではオーバーフローや切り捨てが発生することがあります。
命名規約
先頭が大文字の識別子はパッケージ外に公開され、小文字は非公開です。キャメルケースを使用し、ローカル変数は短くします。
3.データ型
組み込み型、構造体、配列、インターフェース、ジェネリクスについて説明します。
基本型
bool、string、整数、浮動小数、複素数、byte/rune のエイリアスがあります。
数値演算
算術演算、ビット演算、math パッケージを使用できます。整数の除算は切り捨てで、オーバーフローに注意してください。
struct
struct はフィールドを組み合わせた型です。フィールド名または位置で初期化でき、フィールドタグでメタデータを付与できます。
配列
配列は固定長で値型(コピー)です。日常的にはあまり使わず、ほとんどの場合はスライスを使用します。
type 定義
type で新しい型やエイリアスを定義します。定義した型は元と異なるため、変換が必要です。
ジェネリクス
ジェネリック関数は [T any] のような型パラメータを使用します。制約インターフェースで受け入れる型を限定できます。
interface 型
インターフェースはメソッドの集合を定義します。空インターフェース interface{}(any)は任意の型を表します。
comparable 制約
comparable は組み込みの制約で、== で比較できる型を表します。マップのキーやジェネリックの比較に使用します。
4.ポインタ
ポインタとアドレス操作:アドレス取得、ポインタ間接参照、new/make、スタックとヒープについて説明します。
アドレス取得 &
& は変数のアドレスを取得してポインタを返します。ポインタは変数のメモリ位置を保持します。
デリファレンス *
*p でポインタが指す値にアクセスします。構造体のポインタは自動的に間接参照されます。
nil ポインタ
nil ポインタはゼロ値です。nil をデリファレンスするとパニックしますので、使用前にチェックしてください。
ポインタ引数
ポインタ引数を使うと呼び出し元の変数を変更できます。値引数はコピーです。大きな構造体はポインタで渡すとコピーを節約できます。
new と make
new は値型にメモリを確保してポインタを返し、make はスライス・マップ・チャネルを初期化します。用途が異なります。
ポインタのイディオム
ポインタは可変状態を共有するために使います。ポインタと値のどちらを返すかはセマンティクスとメソッドレシーバで判断します。
スタックとヒープ
変数がスタックとヒープのどちらに置かれるかはコンパイラがエスケープ解析で決定します。
ポインタ安全性
Go のポインタは算術演算をしません(C 風の +1 は不可)。GC がライフサイクルを管理するためダングリングポインタは発生しません。
5.制御フロー
if、for、switch、defer、ループ制御について説明します。
if / else
if の条件に括弧は不要です。条件の前に初期化文を置けます。条件はブール値でなければなりません。
for ループ
Go には for ループしかありません。C 風の 3 段形式、while 風の条件式のみ、無限ループの 3 つの形式があります。
range 反復
range は配列、スライス、マップ、文字列、チャネルを反復します。Go 1.22 以降、ループ変数は反復ごとに独立します。
switch
switch は case を自動で降りません。複数の値、無式(if-else の連鎖)、型スイッチが使えます。
defer
defer は関数の終了まで実行を遅らせ、LIFO 順で実行されます。リソース解放によく使われます。
break と continue
break はループを抜け、continue は次の反復へ進みます。ラベルで入れ子のループも制御できます。
初期化付き switch
switch の前に初期化文を書けます。エラーハンドリングのチェインなどで便利です。
goto とラベル
goto はラベルへジャンプします。Go ではサポートされていますが、あまり使われません。深いネストのエラー処理などに限定されます。
6.関数
関数定義、複数の戻り値、クロージャ、メソッド、関数値を扱います。
関数定義
func で関数を定義します。引数は型を伴い、戻り型は最後に書きます。
複数の戻り値
Go の関数は複数の値を返せます。慣習として (値, error) を返します。
名前付き戻り値
戻り値に名前を付けられます。関数内で代入し、裸の return で自動的に返すことができます。
可変長引数
...T で任意の数の引数をスライスとして受け取れます。呼び出し側は slice... で展開できます。
クロージャ
クロージャは外側の変数をキャプチャします。返された関数は独自の状態を保ちます。1.22 以降、ループ変数は反復ごとにキャプチャされます。
メソッド
メソッドは型に紐づき、レシーバは func とメソッド名の間に書きます。
関数値
関数は第一級市民で、変数代入・引数・戻り値に使えます。関数型はシグネチャで表します。
init 関数
init はパッケージがインポートされたときに自動で実行されます。1 つのファイルに複数の init を書けます。
7.文字列
不変文字列、rune/バイト、strings パッケージ、フォーマットについて説明します。
文字列の基礎
文字列は不変のバイト列です。ダブルクォートは通常の文字列、バッククォートは生の文字列リテラルです。
rune と文字
rune は Unicode コードポイント(int32)です。range は rune ごとに進み、unicode/utf8 でデコードします。
strings.Builder
Builder は文字列を効率的に連結します。ループ内での + 連結より割り当てを抑えられます。
strings パッケージ
Contains、Split、Join、Trim、Replace などさまざまな文字列操作があります。
fmt フォーマット
Printf/Sprintf の動詞、幅、精度、パディングを制御できます。Fprintf は io.Writer に書き出します。
strconv 変換
文字列と数値、ブール値の相互変換を行います。クォートやエスケープも扱えます。
エンコード処理
base64、hex、URL エンコードを扱います。[]byte と文字列の相互変換もよく使われます。
文字の反復
非 ASCII のテキストを安全に処理するには rune 単位で反復します。インデックスはバイト単位である点に注意してください。
8.コレクション
スライス、マップ、配列、ソートについて説明します。
スライス slice
スライスは基底配列に対する動的なビューです。nil スライスも長さ 0 で append などが可能です。
スライス操作
append で追加、copy で複製、append のイディオムで削除・挿入を行います。
make と容量
make はスライスを生成してキャパシティを事前確保します。append による再アロケーションを防ぎ、cap で成長戦略を制御します。
map
マップはキーと値の対を保持します。make で作成し、読み書き・削除・反復が可能です。nil マップは読み取り専用です。
map のイディオム
マップはセット、カウンタ、キャッシュとして利用できます。キーによる値の集約にも便利です。
ソート
sort パッケージでスライスをソートできます。比較関数を渡したり sort.Search で二分探索をしたりできます。
container パッケージ
container/heap でヒープ、container/list で双方向連結リストを使えます。データ構造が必要なときに利用します。
反復のコツ
range でインデックスや値を取り出し、マップではキーをソートして走ると順序が安定します。
9.メモリと性能
ガベージコレクション、エスケープ解析、割り当て最適化、メモリプロファイリングを扱います。
ガベージコレクション
Go は並行・低レイテンシの自動 GC を備えています。free を呼ぶ必要はありません。
エスケープ解析
コンパイラが変数の配置場所を決定します。アドレス取得やインターフェースへの格納でエスケープが発生することがあります。
割り当て最適化
キャパシティの事前確保、バッファの再利用、小さな割り当ての削減でホットパスを最適化します。
ファイナライザ
runtime.SetFinalizer でオブジェクト回収前にクリーンアップを登録できます。外部リソースの安全網として有用です。
メモリモデル
並行下では、書き込みは同期イベント(チャネル、ミューテックス、atomic)を介してのみ他の goroutine から見えます。
メモリプロファイリング
pprof でメモリと CPU をプロファイリングできます。ヒープスナップショットはリーク調査に有効です。
sync.Pool
Pool は短命なオブジェクトを再利用して GC 圧を下げます。バッファやデコーダーに向いています。
スタックと再帰
goroutine のスタックは動的に拡張しますが、再帰が深すぎると制限に達します。深い再帰はループに書き換えましょう。
10.構造体とメソッド
Go の OOP:構造体、インターフェース、埋め込みと合成(クラス継承はありません)。
struct とメソッド
構造体はデータを保持し、メソッドで振る舞いを結び付けます。コンストラクタ関数で生成するのが慣習です。
レシーバの選択
値レシーバは元の値を変更せず、ポインタレシーバは変更します。同じ型のメソッドはレシーバの種類を統一しましょう。
インターフェース
インターフェースは振る舞いの契約を表します。メソッド集合が一致すれば暗黙的に実装になります。
インターフェースと nil
nil インターフェースと、型付きの nil を保持するインターフェースは異なります。判別に注意しましょう。
埋め込み
埋め込みフィールドやインターフェースにより、そのメソッドが昇格されます。継承より合成を選びましょう。
合成
Go は継承ではなく合成で再利用を実現します。小さなインターフェースを組み合わせて大きな機能を作ります。
型アサーション
インターフェースを具体的な型にアサートします。ok 形式で安全に扱い、type switch で分岐できます。
any / 空インターフェース
any は interface{} のエイリアスで任意の型を保持します。使うときは型アサーションが必要です。
11.エラー処理
error インターフェース、エラーラップ、errors.Is/As、panic/recover を扱います。
error インターフェース
error は組み込みインターフェースで、Error() string メソッドを持ちます。例外ではなくエラー値を返します。
エラーの返し方
エラーは呼び出しチェーンを遡って返します。各段で err != nil をチェックして処理します。
エラーメッセージ
fmt.Errorf でフォーマット付きエラー、errors.New で単純なエラーを生成します。%w でラップできます。
errors.Is
errors.Is はエラーチェーンを辿って一致を判定します。err == での比較よりこちらが推奨されます。
errors.As
errors.As はエラーチェーンから指定した型のエラーを見つけ出して取り出します。
panic と recover
panic は goroutine を中断し、recover は defer 内でしか使えません。回復不能な状況にのみ使用します。
defer でのエラー処理
名前付き戻り値を使うと、defer 内で戻り値にエラーを代入できます。
エラーの結合
errors.Join は複数のエラーを 1 つにまとめます。複数の検証やタスクを一括で扱うのに便利です。
12.入出力
ファイル入出力、bufio、JSON、io.Reader/Writer について説明します。
ファイルの読み込み
小さなファイルは os.ReadFile で読み込めます。大きなファイルは os.Open + Reader(bufio.Scanner など)でストリーム処理します。
ファイルの書き込み
os.WriteFile で一括書き込み、os.OpenFile で追記、bufio.Writer でバッファリング書き込みを行います。
JSON シリアライズ
json.Marshal で構造体を JSON に変換します。フィールドタグで JSON キーやオプションを制御できます。
JSON デシリアライズ
json.Unmarshal で JSON を構造体やマップにデコードできます。大きなデータは json.NewDecoder でストリーム処理します。
io.Reader / Writer
io.Reader/Writer はストリームを抽象化します。io.ReadAll と io.Copy はよく使うヘルパーです。
bufio バッファ
bufio はバッファリングでシステムコールを減らします。Scanner で 1 行ずつ反復できます。
標準ストリーム
os.Stdin/Stdout/Stderr が標準ストリームです。fmt.Scan や bufio.Scanner で入力を受け付けます。
パス操作
filepath でプラットフォームに依存しないパス操作を行えます。Join、Dir、Base、Ext が日常的に使われます。
13.よくある落とし穴
Go の日常開発でありがちな落とし穴と正しい書き方を紹介します。
nil と空スライス
nil スライスと空スライスは別物です。JSON 化すると nil は null、空は [] になります。意図を明示しましょう。
ループ変数のキャプチャ
Go 1.22 以前はループ変数を goroutine で共有する問題がありましたが、1.22 以降は反復ごとに独立します。
マップの反復順はランダム
マップの反復順はランダムです。安定した順序が必要ならキーをソートしてから反復しましょう。
文字列の変更
文字列は不変です。ASCII の編集は []byte に、テキスト編集は []rune に変換してから行いましょう。
スライスのコピーと共有
スライスの代入は基底配列を共有します。独立したコピーを作るには copy を使います。
エラーの無視
エラーを無視すると静かに失敗します。処理する、ログする、_ で意図を示す、のいずれかにしましょう。
レシーバの不整合
同じ型で値レシーバとポインタレシーバが混在すると、インターフェース実装などで不整合が生じます。どちらかに統一してください。
変数シャドーイング
内側スコープで := を使うと新しい変数が作られ、外側をシャドーイングします。= で使い回すか明示してください。
ループ内の defer
ループ内の defer は外側の関数終了まで実行されません。各反復を関数化するか、明示的にクローズしましょう。
14.並行処理
goroutine、channel、select、並行安全について説明します。
goroutine
go キーワードで並行関数を起動します。goroutine は軽量でスタックも動的に伸びます。main が終わるとプログラムも終了します。
channel
チャネルは goroutine 間の通信路です。バッファなしチャネルは送受信が同期的にブロックします。
バッファ付き channel
make(chan T, n) でバッファ付きチャネルを作れます。満杯なら送信、空なら受信がブロックします。
select
select で複数のチャネル操作を同時に待ちます。複数の case が準備できたらランダムに選ばれ、default で非ブロックにできます。
WaitGroup
sync.WaitGroup で goroutine の完了を待ちます。先に Add、終了時に defer Done、最後に Wait を呼びます。
ミューテックス
sync.Mutex で共有データを保護します。読み込み中心なら sync.RWMutex を使うと並行性が上がります。
sync.Once
sync.Once は関数を 1 度だけ実行することを保証します。遅延シングルトンや並列安全な初期化に使えます。
データ競合の検出
go run -race(または go test -race)で同期されていない並列アクセスを検出できます。
15.ネットワーク
HTTP リクエスト、サーバー、context、TCP を扱います。
HTTP GET
http.Get で GET を送ります。resp.Body は defer で必ず閉じ、ステータスコードを確認しましょう。
HTTP サーバー
http.HandleFunc でハンドラを登録し、ListenAndServe で待ち受けます。Graceful shutdown には *http.Server を使います。
HTTP クライアント
http.Client でタイムアウトと接続プールを設定します。http.NewRequest でメソッド・ヘッダー・ボディを自由に組み立てられます。
JSON API
JSON API レスポンスを構造体にデコードします。フィールドタグで API フィールド名を Go の名前にマッピングします。
context
context はキャンセルと期限を伝播します。WithTimeout / WithCancel で派生し、I/O に貫流させましょう。
URL パース
url.Parse で URL を分解し、url.Values.Encode でクエリ文字列を構築します。
TCP ソケット
net.Dial で接続し、net.Listen で待ち受けます。コネクションはバイトストリームの io.ReadWriteCloser です。
ルーターの強化
Go 1.22 以降の http.ServeMux はメソッドとパス変数({id})をサポートします。
16.時間と日付
time パッケージ、Duration、フォーマット、タイムゾーンについて説明します。
現在時刻の取得
time.Now で現在時刻を取得し、各フィールドにアクセスできます。.UTC() / .In(loc) でタイムゾーンを変換します。
Duration
time.Duration はナノ秒の整数です。time.Second などの定数と組み合わせ、加減やスリープに使います。
フォーマット
Time.Format はレイアウト文字列に従って整形します。リファレンスタイム「2006-01-02 15:04:05」を使います。
パース
time.Parse は同じリファレンスレイアウトで文字列を Time に変換します。タイムゾーンには ParseInLocation を使います。
Ticker
time.Ticker は一定間隔で発火します。不要になったら defer ticker.Stop() でリソースを解放します。
Sleep と待機
time.Sleep はその goroutine を指定時間ブロックします。キャンセル可能な遅延には Timer / After を使います。
Timer
time.Timer は指定時間後に 1 度だけ発火します。Stop / Reset で制御し、select と組み合わせてキャンセルできます。
タイムゾーン
IANA タイムゾーンは time.LoadLocation で読み込み、.In(loc) で適用します。time.FixedZone で固定オフセットも作れます。
17.プロセスと環境
コマンドライン引数、環境変数、サブプロセス、終了コードについて説明します。
コマンドライン引数
os.Args はコマンドライン引数のスライスです。os.Args[0] はプログラムパス、残りはユーザー引数になります。
flag パース
flag パッケージでコマンドラインフラグを解析します。デフォルト値を指定し、Parse 後に値を読みます。
環境変数
os.Getenv で読み取り、os.Setenv で設定、os.LookupEnv で未設定と空文字を区別します。
終了コード
os.Exit は指定した終了コードで直ちに終了します。0 が成功、0 以外が失敗です。defer は実行されません。
サブプロセスの実行
exec.Command で外部コマンドを実行します。stdout / stderr を取得したり、stdin をパイプしたり、環境変数を設定できます。
シグナル処理
signal.Notify で OS シグナルをチャネルに届けます。SIGINT / SIGTERM を処理してGraceful shutdown を行います。
ファイルシステム
MkdirAll でディレクトリ作成、RemoveAll でツリー削除、Rename で移動、Stat で情報を取得します。
作業ディレクトリ
os.Getwd で現在の作業ディレクトリを取得し、os.Chdir で変更します。filepath.Abs で絶対パスに変換しましょう。
18.正規表現
regexp パッケージ:コンパイル、マッチ、検索、置換、キャプチャグループについて説明します。
コンパイル
regexp.Compile はエラーを返します。regexp.MustCompile は失敗時にパニックし、パッケージスコープでの定義に向きます。
マッチ判定
MatchString は文字列マッチ、Match は []byte マッチを判定します。完全一致は ^...$ で囲みます。
検索
FindString は最初のマッチを返し、FindStringIndex はバイト位置を返します。
全マッチ
FindAllString で全マッチを取得できます。-1(または省略)で無制限に、整数で上限を指定します。
置換
ReplaceAllString で全マッチを置換します。$1, $2 でキャプチャグループを参照できます。
分割
re.Split でパターンに基づき文字列を分割できます。-1 で無制限になります。
キャプチャグループ
括弧でサブマッチを抽出します。FindStringSubmatch で取得し、名前付きグループ (?P<name>) も使えます。
よく使うパターン
よく使う正規表現(メール、URL、IP、電話番号など)と基本構文(\d、\w、\s、量詞、^、$)をまとめます。
19.ビルドとテスト
ビルド、単体テスト、静的検査、クロスプラットフォームコンパイルを扱います。
go build
go build でパッケージをコンパイルします。-o、-tags、-ldflags などで出力やオプションを制御できます。
単体テスト
go test が *_test.go を実行します。t.Error / t.Errorf で非致命、t.Fatal / t.Fatalf でそのテストを停止します。
ベンチマーク
go test -bench で Benchmark 関数を実行します。フレームワークが b.N 回ループしてオペレーション単価を計測します。
静的解析
go vet はありがちなミス(printf の型不一致、ロックの誤用など)を検出します。CI で必ず実行しましょう。
フォーマット
gofmt が公式フォーマッタです。goimports を併用するとインポートの自動整理もできます。
クロスコンパイル
GOOS と GOARCH を指定して go build を実行するとクロスコンパイルできます。CGO を有効にする場合は対応するクロスの C ツールチェインが必要です。
競合検出
go build -race(または go test -race)でランタイムのデータ競合検出を有効化できます。
モジュールバージョン
go.mod でバージョンを固定し、go get で更新、replace で別モジュールへ向け、go.sum で整合性を検証します。
CI 連携
CI ではフォーマット、go vet、go test -race -cover、ビルド、アーティファクト公開を順に実行するのが一般的です。
このチートシートについて
このページは Go 1.22 の自己完結型クイックリファレンスです。言語コアと、実プロジェクトで日常の約 80% を占める標準ライブラリを扱います。内容は現代のイディオムを重視しており、短変数宣言、errors.Is / errors.As による構造化エラー、ジェネリクス、Go 1.22 からの反復ごとに独立したループ変数を取り上げます。信頼できるリファレンスとしては、公式 Go チュートリアルと Effective Go を参照してください。 19 のセクションはそれぞれ 1 つのテーマに焦点を当てており、最初のプログラムから goroutine、インターフェース、そしてよくある落とし穴までを順にカバーします。各セクションは 8〜14 のサブトピック(5〜20 行ずつのコード例)に分かれており、合計でおよそ 150 トピックあります。コードは意図的に短く自己完結的にしてあります。 すべての処理はブラウザ内で行われます。アップロードも追跡もありません。このページは GuruToolkit の無料開発者向けツール集の一部で、掲載されているコードは自由に使えますが、いかなる保証もありません。
バージョン 2.1.0