今回はgolangのfor rangeを用いたループ処理について解説していきます。
for rangeとは
Goではrangeを使うことで配列、スライス、mapなど様々なデータ構造から値を繰り返しながら取得することができます。
他のプログラミング言語ではforeach文を使うことで実現できますが、Goではfor rangeを使います。
それではデータ構造ごとにどのように値を取り出すのか見ていきましょう。
rangeで配列から値を取り出す
まずは配列から値をループしながら取得する方法についてです。
下記コードのように要素数3のstring型の配列aを宣言します。このaから要素の値を繰り返しながら取得します。
func main() {
a := [3]string{"x", "y", "z"}
for i, v := range a {
fmt.Println(i, v)
}
}
変数iにはインデックス、変数vには配列aの値がセットされます。
実行結果は0 x 1 y 2 zとなります。
ちなみにインデックスを取得しなくてもいい場合はアンダースコア_を書くことで省略することができます。
func main() {
a := [3]string{"x", "y", "z"}
for _, list := range a {
fmt.Println(list)
}
}
インデックスを取得しなかった、この実行結果はx y zとなります。
rangeでスライスから値を取り出す
次にスライスから値を取り出す方法です。
基本的には配列時から値を取り出す方法となります。
func main() {
a := []string{"x", "y", "z"}
for i, list := range a {
fmt.Println(i, list)
}
}
実行結果は0 x 1 y 2 zとなります。配列から要素数を取り除いたものがスライスなので当然といえば当然ですね。
こちらも配列同様にインデックスを省略して要素を取得することができます。
func main() {
a := []string{"x", "y", "z"}
for _, list := range a {
fmt.Println(list)
}
}
もちろんこの実行結果もx y zとなります。
スライスについては以下の記事で詳細を解説しているので、理解を深めたい方はこちらの記事も参照してみてください。
rangeでmapから値を取り出す
最後にmapから要素を取り出す方法についてです。
keyがstring、valueがint型のmapを用意しました。
func main() {
a := map[string]int{"x": 1, "y": 2, "z": 3}
for k, v := range a {
fmt.Println(k, v)
}
}
これについてもrangeを使うことでkeyとvalue両方を取り出すことができます。
このコードの実行結果はx 1 y 2 z 3となりました。
mapの取得では気を付けなければいけない点があります。実はmapのイテレーションは取得順序が決まっていないということです。
さきほどはたまたまx 1 y 2 z 3と順序通りに取得できましたが、何回か実行しているとz 3 x 1 y 2やy 2 z 3 x 1と取得されることがあります。
mapをfor rangeで取得する場合は順序に依存した処理にしないよう注意が必要となります。
mapについては以下の記事で詳細を解説しているので、理解を深めたい方はこちらの記事も参照してみてください。
golangをもっと詳しくなりたい方に
golang学習のために筆者が実際に受講したUdemy教材をまとめています。
golang学習のために筆者が実際に読んでおすすめしたい本をまとめています。