Go Academy · レッスン

rangeによるコレクションの反復

スライス、マップ、文字列に対するrangeの利用

レッスン 4/413 ステップ

「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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 配列:固定長のコレクション
  2. スライス:動的なリスト
  3. マップ:キーと値のストア
  4. rangeによるコレクションの反復
← Go Academyに戻る