コンテンツにスキップ

Go 面接──実務レベルが問われる「退屈な質問」とデバッグツール

ほとんどの Go 面接は構文をテストする。

実務経験は「退屈に見える質問」に現れる。

シニアレベルを測る質問

質問 測っていること
ゴルーチンのリークをどうやって止めるか? context キャンセル・done チャネル・defer による cleanup の理解
チャネルはいつ閉じるか?誰が所有するか? 所有権の原則(送信側が close する)・close 後 receive の挙動
pprof でスタックした HTTP ハンドラはどう見えるか? プロファイリングツールの実務経験
タイムアウト・キャンセルを 4 層通過して送信するには? context.Context の伝搬パターン

実際のインシデントから来る質問

  • 無制限バッファのメモリ増加: make(chan T, N) の N を過大に設定、バッファが詰まって OOM

  • コピーしたミューテックスによるデッドロック: sync.Mutex は値コピーで壊れる(ポインタで渡すべき)

  • time.After がホットループに: select 内の time.After は毎回 Timer をアロケートする。time.NewTimer を使い Reset する

  • GOMAXPROCS がコンテナで変わる: デフォルトで CPU コア数を使うが、コンテナの cgroup 制限を無視するため automaxprocs ライブラリを使う

良い回答で言及すべきツール

ツール 用途
pprof CPU・メモリ・ゴルーチンのプロファイリング
go tool trace ゴルーチンのスケジューリング・GC の可視化
expvar 実行時のメトリクス公開(HTTP エンドポイント)
-race フラグ データ競合の検出(race detector)

バックプレッシャーとバジェットの言及

  • チャネルのバッファを使ってバックプレッシャーを実装し、処理が詰まったときに upstream に通知する設計

  • タイムアウトバジェット(全体の締め切りから各層のタイムアウトを差し引いていく)の概念

要点

  • Go 面接では構文より「実際のインシデントで何を経験したか」が差をつける

  • ゴルーチンリーク・ミューテックスのコピー・time.After のアロケーションは頻出のバグパターン

  • pprof・race detector を日常的に使った経験を語れることが重要