0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Goのfor文を理解する(break / continue / range / ラベル付き)

0
Posted at

1. はじめに

この記事でわかること:

  • Goの for の書き方は大きく3パターン
  • breakcontinue の使いどころ
  • range の基本(配列・map)
  • ラベル付き for の挙動

2. 無限ループ(for { })

for {} は無限ループです。break で抜けます。

i := 0
for {
	i++
	fmt.Println(i) // 1 → 2 → 3
	if i == 3 {
		break
	}
}

実行イメージ(出力)

1
2
3

3. 条件付きループ(while風)

Goには while がない代わりに、こう書きます。

point := 1
for point < 10 {
	fmt.Println(point) // 1, 2, 3, ... 9
	point++
}

ポイント

  • for 条件 {} が while 相当
  • () は不要、{} は必須

4. 3要素for(初期化; 条件; 更新)

もっとも一般的なforです。

for i := 0; i < 10; i++ {
	fmt.Println(i) // 0〜9
}

5. break / continue の基本

continue(次のループへ)

for i := 0; i < 10; i++ {
	if i == 3 {
		fmt.Println(3) // 3
		continue
	}
	fmt.Println(i) // 0,1,2,4,5,6,7,8,9
}

break(ループを抜ける)

for i := 0; i < 100; i++ {
	if i > 30 {
		fmt.Println("抜けた") // 抜けた
		break
	}
}

6. 配列を for で回す(index指定)

arr := [3]int{1, 2, 3}

for i := 0; i < len(arr); i++ {
	fmt.Println(i, arr[i])
}

出力

0 1
1 2
2 3

7. range(配列 / スライス)

arr := [3]int{1, 2, 3}

for i, v := range arr {
	fmt.Println(i, v)
}

出力

0 1
1 2
2 3

index が不要なら _ を使う

for _, v := range arr {
	fmt.Println(v) // 1 → 2 → 3
}

8. range(map)

mapも range で回せます。

m := map[string]int{"apple": 100, "banana": 200}

for k, v := range m {
	fmt.Println(k, v) // 順序は不定
}

ポイント

  • map は毎回同じ順で出るとは限りません

キーだけ / 値だけも可能です。

for k := range m {
	fmt.Println(k) // apple or banana(順序不定)
}

for _, v := range m {
	fmt.Println(v) // 100 or 200(順序不定)
}

9. 2ずつ増やす(i += 2)

for i := 0; i < 10; i += 2 {
	fmt.Println(i) // 0, 2, 4, 6, 8
}

10. ラベル付きfor(break / continue)

複数ループがネストしているとき、

「どのループを抜ける/続けるか」を指定したいことがあります。

そこで使うのがラベル付き forです。

10-1. ラベル付き break(外側まで一気に抜ける)

LOOP:
	for {
		for {
			for {
				fmt.Println("START") // START
				break LOOP
			}
			fmt.Println("処理しない")
		}
		fmt.Println("処理しない")
	}
fmt.Println("END") // END

出力

START
END

break LOOP により、ラベルのついたforまで一気に脱出します。

10-2. ラベル付き continue(外側の次の周へ)

LOOP2:
	for i := 0; i <= 3; i++ {
		for j := 1; j <= 3; j++ {
			if j > 1 {
				continue LOOP2
			}
			fmt.Println(i, j, i*j)
		}
	}

このコードは、j=1(つまり j=2,3)になった瞬間、

内側ではなく外側(LOOP2)の次の i へ進みます。

出力

0 1 0
1 1 1
2 1 2
3 1 3

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?