rangeによるコレクションの反復
スライス、マップ、文字列に対するrangeの利用
「rangeによるコレクションの反復」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
range とは
range は、配列、スライス、マップ、文字列、チャネルを反復処理する for ループの特殊な形式です。各反復でインデックス(またはキー)と値を返します。
スライスに対する range
インデックスと要素のコピーを返します。
package main
import "fmt"
func main() {
fruits := []string{"apple", "banana", "cherry"}
for i, fruit := range fruits {
fmt.Printf("%d: %s\n", i, fruit)
}
}配列に対する range
スライスの場合と同じように動作します。配列の要素は反復ごとにコピーされます。
package main
import "fmt"
func main() {
nums := [3]int{10, 20, 30}
for _, v := range nums {
fmt.Println(v)
}
}マップに対する range
キーと値をランダムな順序で返します。
package main
import "fmt"
func main() {
capitals := map[string]string{
"France": "Paris",
"Japan": "Tokyo",
}
for country, city := range capitals {
fmt.Printf("%s -> %s\n", country, city)
}
}文字列に対する range
バイトではなく、Unicodeコードポイント(rune)を反復処理します。インデックスは、その rune の先頭のバイト位置です。
package main
import "fmt"
func main() {
for i, r := range "héllo" {
fmt.Printf("%d: %c\n", i, r)
}
}インデックスの破棄
値だけが必要でインデックスを無視する場合は、_を使用します。
package main
import "fmt"
func main() {
total := 0
for _, v := range []int{1, 2, 3, 4, 5} {
total += v
}
fmt.Println(total) // 15
}インデックスのみの range
値を省略すると、インデックスだけが得られます。インプレースで変更する場合に便利です。
package main
import "fmt"
func main() {
s := []int{1, 2, 3}
for i := range s {
s[i] *= 2
}
fmt.Println(s) // [2 4 6]
}チャネルに対する range
rangeは、チャネルが閉じられるまでチャネルから読み取ります。
package main
import "fmt"
func main() {
ch := make(chan int, 3)
ch <- 1; ch <- 2; ch <- 3
close(ch)
for v := range ch {
fmt.Println(v)
}
}ループ変数の落とし穴
range変数は反復ごとに再利用されます。そのアドレスをゴルーチンやクロージャでキャプチャするのは、典型的なバグです。
package main
import "fmt"
func main() {
nums := []int{1, 2, 3}
funcs := make([]func(), 3)
for i, v := range nums {
v := v // shadow with a copy
funcs[i] = func() { fmt.Println(v) }
}
for _, f := range funcs { f() } // 1 2 3
}スライス要素の変更
rangeの値はコピーです。変更するにはインデックスを使用します。
package main
import "fmt"
func main() {
s := []int{10, 20, 30}
for i := range s {
s[i]++
}
fmt.Println(s) // [11 21 31]
}簡単な確認
文字列に対して range を使用する場合、値の変数はどの型になりますか。
まとめ: range
要点:
rangeはスライス、配列、マップ、文字列、チャネルで使用できます- (インデックス、値)を返し、どちらも
_で破棄できます - rangeの値はコピーなので、変更する場合はインデックスを使用します
- 文字列からはバイトではなく rune が得られます
- マップの反復順序はランダムです
練習問題
rangeを使用してmap[string]intのすべての値の合計を計算し、各エントリと合計値の両方を出力してください。
AI チューターと学ぶ Go — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 51
- レッスン
- 203
よくある質問
「rangeによるコレクションの反復」レッスンは無料ですか?
はい。「rangeによるコレクションの反復」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「rangeによるコレクションの反復」で何を学びますか?
スライス、マップ、文字列に対するrangeの利用 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「rangeによるコレクションの反復」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 配列:固定長のコレクション
- スライス:動的なリスト
- マップ:キーと値のストア
- rangeによるコレクションの反復