Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

for

Goにはループ構文が『for』だけです。C言語風の三部形式・条件式のみ・無限ループ・rangeを使った反復がすべて『for』で表現できます。

構文
// 三部形式(初期化; 条件; 後処理)
for i := 0; i < 10; i++ {
}

// 条件のみ(whileと同じ)
for 条件式 {
}

// 無限ループ
for {
}

// rangeによるイテレーション
for i, v := range スライス {
}
for k, v := range マップ {
}
for i, r := range 文字列 { // i=バイト位置, r=rune値
}

// インデックスまたは値のみが必要な場合
for i := range スライス {  // インデックスのみ
}
for _, v := range スライス { // 値のみ(_でインデックス破棄)
}
構文一覧
構文概要
for i := 0; i < n; i++ { }C言語風の三部形式のforループです。初期化・条件・後処理を1行にまとめます。
for 条件式 { }他の言語のwhileに相当します。条件がtrueの間ループします。
for { }無限ループです。breakかreturnで抜け出します。
for i, v := range s { }スライス・配列・マップ・文字列・チャネルを反復処理します。
breakループを即座に終了します。ラベルと組み合わせて外側のループを抜けることもできます。
continue現在の反復をスキップして次の反復に進みます。
サンプルコード
package main

import "fmt"

func main() {
	// 三部形式
	sum := 0
	for i := 1; i <= 5; i++ {
		sum += i
	}
	fmt.Println("合計:", sum) // 15

	// rangeでスライスを反復
	fruits := []string{"りんご", "みかん", "ぶどう"}
	for i, v := range fruits {
		fmt.Printf("%d: %s\n", i, v)
	}

	// rangeでマップを反復
	scores := map[string]int{"田中": 85, "鈴木": 92}
	for name, score := range scores {
		fmt.Printf("%s: %d\n", name, score)
	}

	// continueでスキップ(偶数のみ表示)
	for i := 0; i < 10; i++ {
		if i%2 != 0 {
			continue
		}
		fmt.Print(i, " ")
	}
	fmt.Println()

	// 外側ループにラベルを付けてbreakで一気に抜ける
outer:
	for i := 0; i < 3; i++ {
		for j := 0; j < 3; j++ {
			if i == 1 && j == 1 {
				break outer
			}
			fmt.Printf("(%d,%d) ", i, j)
		}
	}
	fmt.Println()
}
概要

『range』を使ったループは、スライス・配列・マップ・文字列・チャネルに対して使用できます。文字列に対して使うと、バイト位置とrune値のペアが返るため、日本語など多バイト文字でも正しく1文字ずつ処理できます。

rangeで返される値はコピーです。スライスの要素をrangeで直接変更することはできません。要素を変更したい場合は『for i := range s { s[i] = ... }』のようにインデックス経由で操作してください。

ラベル付き『break』や『continue』はラベルと同じ仕組みを使います。ネストが深いループからまとめて抜け出すときに活用できますが、使いすぎるとコードが読みにくくなるため注意しましょう。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。