Go - Range: 初心者向けの包括的なガイド
こんにちは、将来のプログラマーさんたち!今日は、Goプログラミングの世界に踏み込み、特にrange
キーワードに焦点を当てていきます。あなたの近所の親切なコンピュータサイエンスの先生として、私は多くの例と説明を交えてこの概念をガイドします。まずはお気に入りの飲み物を用意して、リラックスして、一緒に進んでいきましょう!
Rangeとは?
コードを書く前に、range
について理解しましょう。Goでは、range
はデータ構造の魔法のガイドのようなものです。配列、スライス、マップ、文字列、チャネルなど、さまざまなデータ型をループで回れるようにサポートします。データのコレクションを巡回するためのスイスアーミーナイフのように考えてください。
Rangeの構文
range
の基本的な構文は非常にシンプルです:
for index, value := range collection {
// ここにコードを記述
}
ここで、index
は要素の位置を、value
はその要素自体を返します。今は抽象的だと思うかもしれませんが、すぐに多くの例を見ていきます!
配列とスライスでのRange
まずは配列の簡単な例から始めましょう:
package main
import "fmt"
func main() {
fruits := [3]string{"apple", "banana", "cherry"}
for index, fruit := range fruits {
fmt.Printf("Index: %d, Fruit: %s\n", index, fruit)
}
}
このコードを実行すると以下のように表示されます:
Index: 0, Fruit: apple
Index: 1, Fruit: banana
Index: 2, Fruit: cherry
ここで何が起きているのでしょう?range
キーワードは、私たちがfruits
配列をループで回れるようにサポートしています。ループのEach回で、インデックスとそのインデックスの値(果物の名前)を返します。
インデックスのみを使用する場合
時々、インデックスのみが必要な場合があります。その場合、値の変数を省略できます:
for index := range fruits {
fmt.Printf("Index: %d\n", index)
}
値のみを使用する場合
もしかしたら、インデックスではなく値にだけ興味があるかもしれません。その場合、ブランク識別子_
を使ってインデックスを無視できます:
for _, fruit := range fruits {
fmt.Printf("Fruit: %s\n", fruit)
}
マップでのRange
Goのマップは、鍵と値のペアが詰まった宝箱のようです。それでは、range
がマップでどのように動作するかを見てみましょう:
package main
import "fmt"
func main() {
ages := map[string]int{
"Alice": 25,
"Bob": 30,
"Charlie": 35,
}
for name, age := range ages {
fmt.Printf("%s is %d years old\n", name, age)
}
}
出力:
Alice is 25 years old
Bob is 30 years old
Charlie is 35 years old
ここで、range
はマップの各エントリの鍵(名前)と値(年齢)を返します。
文字列でのRange
Goの文字列はバイトのシーケンスであり、range
を使うとそれを巡回できます:
package main
import "fmt"
func main() {
message := "Hello, 世界"
for index, runeValue := range message {
fmt.Printf("Index: %d, Character: %c, Unicode: %U\n", index, runeValue, runeValue)
}
}
この例では、range
がマルチバイト文字(中国語など)を正しく処理することを示しています。
チャネルでのRange
チャネルは、goroutine間の通信に特化したGoのユニークな機能です。チャネルでrange
がどのように動作するかを見てみましょう:
package main
import "fmt"
func main() {
ch := make(chan int)
go func() {
ch <- 1
ch <- 2
ch <- 3
close(ch)
}()
for num := range ch {
fmt.Println(num)
}
}
この例では、range
はチャネルが閉じられるまで値を受け取り続けます。
Rangeの一般的な用法
以下の表に、range
の一般的な用法をまとめます:
データ型 | 構文 | 説明 |
---|---|---|
配列/スライス | for index, value := range array |
各要素を巡回し、インデックスと値を提供 |
マップ | for key, value := range map |
各キー-値ペアを巡回 |
文字列 | for index, runeValue := range string |
各Unicodeコードポイントを巡回 |
チャネル | for value := range channel |
チャネルが閉じられるまで値を受け取り |
結論
そして、ここまでがrange
キーワードについての壮大な旅です。配列からマップ、文字列からチャネルまで、range
はGoでデータ構造を巡回するための信頼の伴侶です。
忘れてはならないのは、練習は完璧を生むということです。さまざまなデータ型でrange
を使った自分自身のプログラムを書いてみてください。実験をし、間違えをし、それから学んでください。それがプログラミングに精通する最良の方法です。
最後に、ちょっとしたプログラミングのユーモア:プログラマーがダークモードを好む理由は何か?それはライトが虫を引き寄せるからです!?
ハッピーコーディング、そしてrange
があなたと共にありますように!
Credits: Image by storyset