range は、配列、スライス、チャネル、その他のコレクション型を反復するために使用される Go 言語のキーワードです。range キーワード構文を使用すると、コードをより簡潔かつ明確にすることができます。範囲を使用して反復する場合は、さまざまなシナリオでのいくつかの詳細と違いに注意する必要があります。
配列とスライスの反復処理では、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) }
マップを反復処理すると、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) }
Iterate 文字列の場合、range は 2 つの値を返します。最初の値は文字のインデックスで、2 番目の値はこのインデックスの文字値です。プログラムのコンパイル中に文字列がバイト配列に変換されるため、文字ではなくバイトが反復されることに注意してください。
例:
str := "hello,世界!" for index, ch := range str { fmt.Printf("index: %d, char: %c\n", index, ch) }
チャネルを反復すると、範囲はブロックされ続け、チャネルでコンテンツが読み取られるのを待ちます。 。レンジループは、チャネルが閉じられるか、読み取りが完了すると終了します。範囲ループ内の変数は、チャネル値を受け入れる変数です。
例:
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: // 通道中没有值可读 } }
ループ反復に範囲を使用する場合、ループ変数の再利用の問題に注意する必要があります。 。ループ内で変数を使用する場合は、その変数を新しい変数にコピーする必要があります。そうしないと、データの上書きの問題が発生します。
例:
// 错误示例 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 サイトの他の関連記事を参照してください。