Goの制御フローは意図的に最小限です — **1つのループキーワード(for)**しかなく、条件の周りに括弧はなく、中括弧は必須です。この単純性は意図的なもので、各処理を行う唯一の明確な方法を提供します。
なぜ重要なのか
Goの意図的に最小限の制御フローはその単純性の哲学を反映しており、実用的な意味を持っています。
を持つこと(従来型、while風、無限、そしてrangeループをカバー)は、1つの一貫したループ構文があることを意味します — が反復のイディオマティックな方法です。
forだけrange括弧なし、中括弧必須の構文と**if init; cond形式**(特にif err := ...; err != nil)はGoのイディオムを形作ります。switchはデフォルトで通り抜けないことで、C言語ファミリーの一般的なバグを排除し、条件なしのswitchはif/elseの洗練な代替案です。
deferは独特で不可欠なクリーンアップメカニズムです。
これらを理解し、他の言語とどう異なるか(1つのループ、通り抜けなし、defer)理解することは、イディオマティックなGoを読み書きするために根本的に重要です。
if x > 10 { // no parentheses around the condition; braces required
fmt.Println("big")
} else if x > 5 {
fmt.Println("medium")
} else {
fmt.Println("small")
}
// if with an INIT statement — variable scoped to the if/else (very idiomatic)
if err := doSomething(); err != nil {
return err // `err` exists only within this if/else
}
if init; condition形式(変数をifのスコープで宣言)はGoで極めて一般的です — 特にif err := ...; err != nilエラーチェックパターンです。
// 1. classic three-part for
for i := 0; i < 10; i++ { ... }
// 2. while-style (just a condition)
for x < 100 { x *= 2 }
// 3. infinite loop
for { ... break ... } // loop forever until break
// 4. range — iterate slices, maps, strings, channels
for index, value := range mySlice { ... }
for key, value := range myMap { ... }
for i, char := range "héllo" { ... } // i is byte index, char is a rune
for range channel { ... }
Goには**whileやdo-whileがない** — forはすべてのループの必要性をカバーします。range形式はコレクションを反復するイディオマティックな方法です。
switch day {
case "Sat", "Sun": // multiple values per case
fmt.Println("weekend")
case "Mon":
fmt.Println("monday")
// NO break needed — Go does NOT fall through by default!
default:
fmt.Println("weekday")
}
// switch with no condition = clean if/else chain
switch {
case score >= 90: grade = "A"
case score >= 80: grade = "B"
default: grade = "F"
}
C/Javaと異なり、Goのswitchはデフォルトで通り抜けない(breakは不要)— あの古典的なバグを排除します。稀に通り抜けが必要な場合はfallthroughキーワードを使用してください。
func readFile() {
f, _ := os.Open("file.txt")
defer f.Close() // runs when the function RETURNS — guaranteed cleanup
// ... use f ...
}
deferは周囲の関数がリターンするときに実行される呼び出しをスケジュール — クリーンアップ(ファイルクローズ、ミューテックスアンロック)のためのイディオマティックです。