前書き
Go言語には、foreach
文はありません。
そのかわりforeach
ループに相当するrange
キーワードがあります。
この記事では、Goのrange
を使用した繰り返し処理の基本的な使い方と、スライスやマップでの応用例を紹介します。
Rangeの基本構造
range
キーワードは、スライス、マップ、または文字列などのコレクションを繰り返し処理するために使われます。
基本的な構文は以下の通りです。
go
1
2
3
|
for キー, 値 := range コレクション {
// 繰り返し実行されるコード
}
|
range
の動作
range
の動作について例を用いて解説します。
この例では、スライスnumsの各要素にアクセスし、そのインデックスと値を出力します。
go
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package main
import "fmt"
func main() {
// 数値を含むスライスを作成
nums := []int{10, 20, 30, 40, 50}
// range を使ってスライスの各要素にアクセス
for i, num := range nums {
fmt.Printf("Index: %d, Value: %d\n", i, num)
}
}
|
実行結果
1
2
3
4
5
|
Index: 0, Value: 10
Index: 1, Value: 20
Index: 2, Value: 30
Index: 3, Value: 40
Index: 4, Value: 50
|
i
とnum
はそれぞれ下記の情報が代入されます。
i
→ スライスのインデックス(位置)
num
→ そのインデックスにある値
上記の、nums := []int{10, 20, 30, 40, 50}
の場合:
インデックス (i ) |
値 (num ) |
0 |
10 |
1 |
20 |
2 |
30 |
3 |
40 |
4 |
50 |
このデータが for
ループの中で順番に処理されます。
range
の役割
上記の for
文の range
を使った部分:
go
1
|
for i, num := range nums {
|
は、Go での 配列やスライスの各要素を繰り返し処理 するための典型的な書き方です。
range
の使い方(応用)
① インデックスを使わない場合
インデックスが不要な場合は、_
(アンダースコア)を使います:
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package main
import "fmt"
func main() {
// 数値を含むスライスを作成
nums := []int{10, 20, 30, 40, 50}
// range を使ってスライスの各要素にアクセス
// インデックスは使わないため、アンダースコアを使用
for _, num := range nums {
fmt.Println(num) // 値だけを出力
}
}
|
② インデックスだけを使う場合
値が不要でインデックスだけを使う場合:
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package main
import "fmt"
func main() {
// 数値を含むスライスを作成
nums := []int{10, 20, 30, 40, 50}
// range を使ってスライスの各要素にアクセス
// 値を使用しない場合はアンダースコアを使用しなくてもOK
for i := range nums {
fmt.Println(i) // インデックスのみ出力
}
}
|
マップでの使用例
go
1
2
3
4
5
6
7
8
9
10
|
package main
import "fmt"
func main() {
colors := map[string]string{"red": "#ff0000", "green": "#00ff00", "blue": "#0000ff"}
for key, value := range colors {
fmt.Printf("Key: %s, Value: %s\n", key, value)
}
}
|
実行結果
1
2
3
|
Key: red, Value: #ff0000
Key: green, Value: #00ff00
Key: blue, Value: #0000ff
|
この例では、マップcolorsの各要素に対してキーと値を出力します。
map
の使い方については下記記事をお読みください。
Go言語におけるmapの使い方
Rangeの柔軟性
rangeはスライス、マップだけでなく、文字列にも使用できます。
文字列では各文字に対する繰り返し処理が可能です。
文字列での使用例
go
1
2
3
4
5
6
7
8
9
|
package main
import "fmt"
func main() {
for index, char := range "hello" {
fmt.Printf("Index: %d, Character: %c\n", index, char)
}
}
|
実行結果
1
2
3
4
5
|
Index: 0, Character: h
Index: 1, Character: e
Index: 2, Character: l
Index: 3, Character: l
Index: 4, Character: o
|
この例では、文字列"hello"の各文字を出力します。
まとめ
Goのrangeキーワードは、コレクションの要素を効率的に繰り返し処理するための強力なツールです。
スライス、マップ、文字列など、さまざまな型のコレクションを簡単に処理でき、Goプログラミングにおける繰り返し処理の基本となります。