過去のレビュー:
- Go 言語チュートリアル – はじめに (1)
- Go 言語チュートリアル – 言語構造 (2)
- Go 言語チュートリアル – 言語構造 (3)
- Go 言語チュートリアル – データ型 (4)
- Go 言語チュートリアル – 言語変数 (5)
- Go 言語チュートリアル – GO 言語定数 (6)
- Go 言語チュートリアル – GO 言語演算子 (7)
- Go 言語チュートリアル – GO 条件とループ ステートメント (8)
- Go 言語チュートリアル – GO 言語関数 (9)
- Go 言語チュートリアル – GO 言語変数のスコープ (10)
- Go 言語チュートリアル – GO 言語配列 (11)
- Go 言語チュートリアル – GO 言語ポインター (12)
- Go 言語チュートリアル – GO 言語の構造 (13)
range キーワードは Go 言語で非常に一般的で使いやすい構文糖衣で、配列、スライス、マップ、チャネル、文字列、およびトラバーサル出力に関連するすべてのものを反復するために for ループで使用できます。
使い方?
前のセクションのループで初めて range に触れました。ループするキーや値を省略できることもわかりましたが、この機能は実際の状況と組み合わせて検討する必要があります。
Go 言語の range キーワードは、for ループ内で配列 (array)、スライス (slice)、チャネル (channel)、またはコレクション (map) の要素を反復するために使用されます。配列およびスライスでは、要素のインデックスとそのインデックスに対応する値が返され、コレクションではキーと値のペアが返されます。
for ループの範囲形式は、スライス、マップ、配列、文字列などを反復処理できます。形式は次のとおりです。
for key, value := range oldMap {
newMap[key] = value
}
上記コードのキーと値は省略可能です。
キーを読み取るだけの場合、形式は次のようになります。
for key := range oldMap
またはこれ:
for key, _ := range oldMap
値を読み取るだけの場合、形式は次のようになります。
for _, value := range oldMap
例
単純な配列を走査するには、2**%d の結果は、対応する 2 の累乗になります。
例
package main
import "fmt"
var pow = []int{
1, 2, 4, 8, 16, 32, 64, 128}
func main() {
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
}
上記の実行例の出力は次のとおりです。
2**0 = 1
2**1 = 2
2**2 = 4
2**3 = 8
2**4 = 16
2**5 = 32
2**6 = 64
2**7 = 128
次の例に示すように、for ループの範囲形式ではキーと値を省略できます。
例
package main
import "fmt"
func main() {
map1 := make(map[int]float32)
map1[1] = 1.0
map1[2] = 2.0
map1[3] = 3.0
map1[4] = 4.0
// 读取 key 和 value
for key, value := range map1 {
fmt.Printf("key is: %d - value is: %f\n", key, value)
}
// 读取 key
for key := range map1 {
fmt.Printf("key is: %d\n", key)
}
// 读取 value
for _, value := range map1 {
fmt.Printf("value is: %f\n", value)
}
}
上記の実行例の出力は次のとおりです。
key is: 4 - value is: 4.000000
key is: 1 - value is: 1.000000
key is: 2 - value is: 2.000000
key is: 3 - value is: 3.000000
key is: 1
key is: 2
key is: 3
key is: 4
value is: 1.000000
value is: 2.000000
value is: 3.000000
value is: 4.000000
range は他のデータ構造を反復します。
例
package main
import "fmt"
func main() {
//这是我们使用 range 去求一个 slice 的和。使用数组跟这个很类似
nums := []int{
2, 3, 4}
sum := 0
for _, num := range nums {
sum += num
}
fmt.Println("sum:", sum)
//在数组上使用 range 将传入索引和值两个变量。上面那个例子我们不需要使用该元素的序号,所以我们使用空白符"_"省略了。有时侯我们确实需要知道它的索引。
for i, num := range nums {
if num == 3 {
fmt.Println("index:", i)
}
}
//range 也可以用在 map 的键值对上。
kvs := map[string]string{
"a": "apple", "b": "banana"}
for k, v := range kvs {
fmt.Printf("%s -> %s\n", k, v)
}
//range也可以用来枚举 Unicode 字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)本身。
for i, c := range "go" {
fmt.Println(i, c)
}
}
上記の実行例の出力は次のとおりです。
sum: 9
index: 1
a -> apple
b -> banana
0 103
1 111
要約する
range を for ループで使用して、配列、スライス、マップ、チャネル、文字列、および出力の走査に関係するすべてのものを反復できます。
for-range の実装は、実際には C スタイルの for ループです。
インデックスと値を使用して range の戻り値を受け取ると、データのコピーが発生します。