コンテンツにスキップ

Go/for

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go


Goにおける for キーワードは、ループ処理を記述するための唯一の構文です。他の多くのプログラミング言語にある whiledo-while ループは、Go には for を用いて実現されます。for キーワードは非常に柔軟で、様々な形式でループを記述できます。

Go の for ループには、主に以下の4つの形式があります。

1. Cスタイルの for ループ (初期化; 条件; 後処理)

[編集]

最も一般的な形式で、初期化ステートメント、ループ継続条件、および各イテレーション後の後処理ステートメントを指定します。

for initialization; condition; post {
    // ループ内で実行するコード
}
  • initialization (初期化): ループの開始前に一度だけ実行されるステートメントです。通常、ループカウンタの初期化などに使用されます。ここで宣言された変数は、その for ループのスコープ内でのみ有効です。
  • condition (条件): 各イテレーションの開始前に評価される真偽値の式です。この条件が true である限り、ループ内のコードが実行されます。条件が省略された場合、常に true とみなされ、無限ループになります。
  • post (後処理): 各イテレーションの終了後に実行されるステートメントです。通常、ループカウンタのインクリメントやデクリメントなどに使用されます。
package main

import "fmt"

func main() {
	for i := 0; i < 5; i++ {
		fmt.Println(i)
	}
}

この例では、i は 0 で初期化され、i < 5 の間ループが継続し、各イテレーション後に i がインクリメントされます。出力は以下のようになります。

0
1
2
3
4

2. while ループのような形式 (条件のみ)

[編集]

初期化と後処理のステートメントを省略し、条件のみを指定することで、他の言語の while ループと同様の動作を実現できます。

for condition {
    // 条件が true の間、実行するコード
}
package main

import "fmt"

func main() {
	count := 0
	for count < 3 {
		fmt.Println("Count:", count)
		count++
	}
}

この例では、count が 3 より小さい間ループが継続します。出力は以下のようになります。

Count: 0
Count: 1
Count: 2

3. 無限ループ (条件なし)

[編集]

条件を完全に省略すると、無限ループが作成されます。無限ループは、break ステートメントなどを用いて明示的に終了させる必要があります。

for {
    // 永遠に実行されるコード
    // break ステートメントなどでループを抜ける必要がある
}
package main

import (
	"fmt"
	"time"
)

func main() {
	for {
		fmt.Println("永遠に続く...")
		time.Sleep(1 * time.Second)
		// 特定の条件で break を使用してループを終了させる
		// if someCondition {
		// 	break
		// }
	}
}

4. range 句を用いた for ループ

[編集]

for ループは、配列、スライス、マップ、文字列、チャネルなどのコレクション型に対して、要素を反復処理するために range 句と共に使用されることがよくあります。

for index, value := range collection {
    // index: 要素のインデックスまたはキー
    // value: 要素の値
    // ループ内で要素を処理するコード
}

// インデックスやキーが不要な場合は、ブランク識別子 "_" を使用できる
for _, value := range collection {
    // 値のみを使用
}

for index := range collection {
    // インデックスまたはキーのみを使用
}
例 (スライス)
package main

import "fmt"

func main() {
	numbers := []int{10, 20, 30, 40, 50}
	for index, value := range numbers {
		fmt.Printf("Index: %d, Value: %d\n", index, value)
	}
}
例 (マップ)
package main

import "fmt"

func main() {
	ages := map[string]int{"Alice": 30, "Bob": 25, "Charlie": 35}
	for name, age := range ages {
		fmt.Printf("Name: %s, Age: %d\n", name, age)
	}
}

まとめ

[編集]

Go の for キーワードは、様々なループ処理のニーズに対応できる非常に柔軟な構文を提供します。Cスタイルのループ、while ループのような条件のみのループ、無限ループ、そして range 句を用いたコレクションの反復処理など、Go プログラミングにおけるループ処理の基本となります。