Go言語のfor-rangeループを短く書くコツと便利な活用例
生徒
「Go言語のfor文って、配列やスライスをくり返し処理するのに使えるって聞きました。でも書き方が長くなってしまって大変です…」
先生
「それならfor-rangeという便利な書き方を覚えると、とても簡単になりますよ。」
生徒
「どうやって書けばいいんですか?できれば短く書けるコツや、どんな使い方があるのかも知りたいです!」
先生
「では今回は、Go言語のfor-rangeループの使い方と、簡単に書くコツ、それから便利な活用例までしっかり説明しますね!」
1. Go言語のfor-rangeとは?
Go言語のfor-rangeは、スライス(配列のようなもの)や配列、マップ(辞書のようなもの)、文字列などを1つずつ順番に処理するときに使える、とても便利な書き方です。
普通のfor文よりも、コードが短くて見やすくなるのが特徴です。
2. for-rangeの基本的な書き方
スライス(数字の集まりなど)をfor-rangeで1つずつ取り出す基本的な例を見てみましょう。
numbers := []int{10, 20, 30}
for index, value := range numbers {
fmt.Println(index, value)
}
rangeは、「ひとつずつ取り出す」という意味です。上のコードでは、numbersの中にある数字を、1つずつ取り出してvalueに入れています。そしてindexには、その位置(番号)が入ります。
0 10
1 20
2 30
3. インデックスを使わないときは「_(アンダースコア)」を使おう
ときどき、位置(index)は使わずに、値だけ使いたいときがあります。そのときは、アンダースコア _ を使うことで、省略できます。
fruits := []string{"りんご", "みかん", "バナナ"}
for _, fruit := range fruits {
fmt.Println(fruit)
}
りんご
みかん
バナナ
_は「ここに入った情報は使わない」という意味になります。
4. 値を使わずにインデックスだけ使いたいとき
逆に、値は使わずに位置だけ使いたい場合もあります。そのときも、_を使って書けます。
names := []string{"A", "B", "C"}
for i, _ := range names {
fmt.Println("番号:", i)
}
Go1.11以降では、下のようにさらに短く書くこともできます。
for i := range names {
fmt.Println("番号:", i)
}
5. 文字列を1文字ずつ処理するときの使い方
for-rangeは、文字列に使うこともできます。1文字ずつ取り出して処理できます。
message := "こんにちは"
for _, ch := range message {
fmt.Println(string(ch))
}
こ
ん
に
ち
は
1文字ずつ取り出すときは、string(ch)で文字として出力しています。rune型(文字の番号)なので、文字に変換する必要があるのです。
6. マップ(連想配列)でキーと値を取り出す
マップとは、「名前」と「電話番号」のように、キーと値のセットを保存するための型です。for-rangeを使えば、それも簡単に処理できます。
phoneBook := map[string]string{
"田中": "090-1111-2222",
"佐藤": "080-3333-4444",
}
for name, number := range phoneBook {
fmt.Println(name, number)
}
田中 090-1111-2222
佐藤 080-3333-4444
7. for-rangeをもっと短く・簡単に書くコツ
- 位置(インデックス)がいらないとき →
for _, v := range data - 値がいらないとき →
for i := range data for-rangeは、スライス・配列・マップ・文字列に使える- アンダースコア(
_)で使わない部分をスキップ
これらを使いこなすと、Go言語のコードをより短く、読みやすく書くことができます。
まとめ
Go言語で毎日のように登場するfor-rangeは、配列やスライス、マップや文字列といった多様なデータ構造をひとつずつ取り出して処理するための非常に便利な構文です。今回の解説では、このfor-rangeをより短く書く工夫や、初心者がつまずきやすいインデックスと値の扱い方、アンダースコアの使い方、文字列処理の特徴、マップでのキーと値の取り扱いなど、実務でも役立つ使い方を丁寧に整理しました。
Go言語の学習を始めたばかりの段階では、スライスの要素を順番に処理したり、マップからキーと値を取り出したりするだけでもしっかりと理解するには時間がかかることがあります。しかし、for-rangeを使えば、毎回複雑なカウンタ変数を用意したり、要素数を意識した細かなコードを書く必要がなくなり、読みやすくミスの少ないコードを書くことができます。
特に便利なのがアンダースコア「_」です。使わないインデックスや値を明確に「使いません」と示すことで、可読性が向上しコードの意図も伝わりやすくなります。たとえばスライスの中身だけ必要な場合はfor _, v := range itemsのように書き、位置が不要ならアンダースコアを使い、値が不要ならfor i := range itemsのようにより短い書き方で処理できます。
また、文字列を1文字ずつ処理したい場面でもfor-rangeは活躍します。Go言語では文字がrune(Unicodeコードポイント)として扱われるため、出力時にstring(ch)のように文字列型へ変換する必要がありますが、この仕組みを理解しておくと、日本語や絵文字などマルチバイト文字を扱う際にも安心して処理できます。
マップをfor-rangeで処理するときには、キーと値をセットで取り出せるという強みがあります。電話帳、辞書データ、各種設定値などを扱うときに非常に役立つため、スライスや配列とあわせて覚えておくと実務的なコーディングにも応用できます。
以下は、今回学んだ内容を応用して、スライス・マップ・文字列を組み合わせて処理するサンプルプログラムです。for-rangeの便利さがより実感できる例になっています。
package main
import "fmt"
func main() {
fruits := []string{"りんご", "みかん", "バナナ"}
for i, fruit := range fruits {
fmt.Println(i, fruit)
}
message := "ありがとう"
for _, ch := range message {
fmt.Println(string(ch))
}
prices := map[string]int{
"りんご": 120,
"みかん": 80,
"バナナ": 150,
}
for name, price := range prices {
fmt.Println(name, price)
}
}
このように、for-rangeを活用すると、複数の異なるデータ型でも共通の書き方で処理できるため、Go言語のコードはより統一感が生まれ、読みやすく整った形になります。複雑なロジックもfor-rangeを上手に使うことでスッキリと表現できるため、学び始めの段階でしっかり身につけておくと、後の開発がとても楽になります。
コード量を減らしつつ意味を分かりやすく伝えることは、プログラミングでは重要な考え方です。今回のfor-rangeの学習を通じて、繰り返し処理の基礎だけでなく、Go言語特有の書き方に対する感覚も身につけられるはずです。これからGo言語での開発を進めるうえで必ず役に立つ知識ですから、何度も手を動かしながら慣れていきましょう。
生徒
「for-rangeがここまで便利だとは思いませんでした。特にアンダースコアを使って短く書けるところが良かったです!」
先生
「そうですね。Go言語はシンプルで読みやすいコードを書くことが大切なので、for-rangeはまさにその考え方に合っています。インデックスや値を使い分けるのもポイントですよ。」
生徒
「文字列を1文字ずつ処理できるのも便利でした。最初はruneって何だろうと思っていましたが、仕組みがわかると納得できますね。」
先生
「その通りです。マップでキーと値をまとめて取り出せるのも覚えておくと、実際のアプリ開発でも役に立ちますよ。これからも繰り返し実践しながら慣れていきましょう。」