メインコンテンツにスキップ
モジュール 2 · レッスン 3 / 5コース内の 8/50~10 min
モジュールのレッスン (3/5)

...範囲用

for ... range は、コレクションを反復処理する慣用的な方法です。 スライス、配列、マップ、文字列、チャネル。構文が少し変わります コレクションによって異なりますが、基本パターンは常に同じです。 for key, value := range coll { ... }。

スライスと配列の範囲

インデックスと値のコピーを返します:

Go
nums := []int{10, 20, 30}
for i, v := range nums {
    fmt.Println(i, v)
}
// 0 10
// 1 20
// 2 30

多くの場合、2 つのうちの 1 つで十分です。

Go
// solo indice
for i := range nums { _ = i }

// solo valore (ignora indice con _)
for _, v := range nums { _ = v }

地図上の範囲

キーと値を返します:

Go
prices := map[string]int{"pane": 2, "latte": 3, "vino": 8}
for k, v := range prices {
    fmt.Println(k, v)
}

文字列の範囲: バイトではなくルーン文字

for i, r := range s は、Unicode コード ポイント (ルーン) ごとに反復します。 バイト。インデックス i は、ルーンの先頭のバイト オフセットです。

Go
for i, r := range "èé" {
    fmt.Printf("%d %c (%U)\n", i, r, r)
}
// 0 è (U+00E8)
// 2 é (U+00E9)

バイトごとに反復するには、従来のインデックス作成を使用します。

Go
s := "ciao"
for i := 0; i < len(s); i++ {
    fmt.Println(s[i])  // byte (uint8)
}

チャンネル上の範囲

チャネルが閉じられるまで繰り返します。

Go
ch := make(chan int)
go func() {
    for i := 0; i < 3; i++ { ch <- i }
    close(ch)
}()
for v := range ch {
    fmt.Println(v)
}

Concurrency モジュールをさらに詳しく見ていきます。

試してみてください

運動#go.m2.l3.e1
試行回数: 0読み込み中…

for-range を使用して、nums のすべての要素のインデックスと値を出力します。

エディターを読み込み中…

3 回の試行後に解決策が利用可能になります

運動#go.m2.l3.e2
試行回数: 0読み込み中…

インデックスを無視して、nums のすべての値を合計します。

エディターを読み込み中…
ヒントを表示

インデックスを破棄するには「_」を使用します。

3 回の試行後に解決策が利用可能になります

Quiz#go.m2.l3.e3
準備完了

m がマップの場合、「for k, v := range m」の最初の変数は何を表しますか?

Go
m := map[string]int{"a": 1, "b": 2}
for k, v := range m { fmt.Println(k, v) }
回答の選択肢

要約

  • 明確なスコープを持つ for k, v := range coll: 使用しないものは _ で破棄します。
  • スライス/配列: 値のインデックス + COPY。変異するには、インデックスを作成します。
  • マップ: キー + 値、実行ごとに ランダムな順序。
  • 文字列: 範囲はバイトごとではなく、ルーン (コード ポイント) ごとに反復されます。
  • チャネル: チャネルが開いている間繰り返します。 close() でクローズされました。