golangで反復に範囲を使用する方法

PHPz
リリース: 2023-04-18 15:40:31
オリジナル
573 人が閲覧しました

range は、配列、スライス、チャネル、その他のコレクション型を反復するために使用される Go 言語のキーワードです。range キーワード構文を使用すると、コードをより簡潔かつ明確にすることができます。範囲を使用して反復する場合は、さまざまなシナリオでのいくつかの詳細と違いに注意する必要があります。

  1. 配列とスライスの反復処理

配列とスライスの反復処理では、range はインデックスと要素値の 2 つの値を返します。 _ プレースホルダーを使用して値の 1 つを省略できます。

例:

arr := [5]int{1, 2, 3, 4, 5}
for index, value := range arr {
    fmt.Printf("index: %d, value: %d\n", index, value)
}

sli := []string{"hello", "world", "golang"}
for i, v := range sli {
    fmt.Printf("i: %d, v: %s\n", i, v)
}
ログイン後にコピー

配列またはスライスを反復するときに、インデックスまたは要素の値のみが必要な場合は、_ プレースホルダーを使用して、対応する変数を無視できます。例:

arr := [5]int{1, 2, 3, 4, 5}
for index, _ := range arr {
    fmt.Printf("index: %d\n", index)
}

sli := []string{"hello", "world", "golang"}
for i := range sli {
    fmt.Printf("i: %d\n", i)
}
ログイン後にコピー
  1. マップを反復処理する

マップを反復処理すると、range は 2 つの値 (キーと値) を返します。配列との違いは、インデックスと要素値の代わりにキーと値のペアが返されることです。

例:

m := map[string]int{"a":1, "b":2, "c":3}
for key, value := range m {
    fmt.Printf("key: %s, value: %d\n", key, value)
}
ログイン後にコピー

マップを反復処理するときに _ を使用して、いずれかの値を無視することもできます:

m := map[string]int{"a":1, "b":2, "c":3}
for k := range m {
    fmt.Println("key:", k)
}
ログイン後にコピー
  1. 文字列を反復処理

Iterate 文字列の場合、range は 2 つの値を返します。最初の値は文字のインデックスで、2 番目の値はこのインデックスの文字値です。プログラムのコンパイル中に文字列がバイト配列に変換されるため、文字ではなくバイトが反復されることに注意してください。

例:

str := "hello,世界!"
for index, ch := range str {
    fmt.Printf("index: %d, char: %c\n", index, ch)
}
ログイン後にコピー
  1. 反復チャネル

チャネルを反復すると、範囲はブロックされ続け、チャネルでコンテンツが読み取られるのを待ちます。 。レンジループは、チャネルが閉じられるか、読み取りが完了すると終了します。範囲ループ内の変数は、チャネル値を受け入れる変数です。

例:

ch := make(chan int, 10)
go func() {
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch)
}()

for val := range ch {
    fmt.Println("value:", val)
}
ログイン後にコピー

チャネルを使用する場合、チャネル内の値が読み取られないとプログラムがフリーズするという事実に特別な注意を払う必要があります。この問題は、バッファーされたチャネルを使用するか、select ステートメントを使用することで解決できます。

バッファ チャネルの例:

ch := make(chan int, 10)
go func() {
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch)
}()

for {
    select {
    case val, ok := <-ch:
        if !ok {
            return
        }
        fmt.Println("value:", val)
    default:
        // 通道中没有值可读
    }
}
ログイン後にコピー
  1. ループ変数の再利用

ループ反復に範囲を使用する場合、ループ変数の再利用の問題に注意する必要があります。 。ループ内で変数を使用する場合は、その変数を新しい変数にコピーする必要があります。そうしないと、データの上書きの問題が発生します。

例:

// 错误示例
sli := []int{1, 2, 3}
for _, v := range sli {
    go func() {
        fmt.Println(v) // 输出结果都是 3
    }()
}

// 正确示例
sli := []int{1, 2, 3}
for _, v := range sli {
    val := v // 复制变量
    go func() {
        fmt.Println(val)
    }()
}
ログイン後にコピー

要するに、 range は Go 言語の非常に実用的なキーワードであり、コレクション内の要素を反復するのに役立ちます。 range を使用する場合は、異なる種類のコレクションを反復したときの戻り値の違いや、ループ変数の再利用の問題に注意する必要があります。

以上がgolangで反復に範囲を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!