// 整数のスライスを作成して値を設定する
slice := []int{10, 20, 30, 40}
// 各要素を反復し、その値を表示する
for index, value := range slice {
fmt.Printf("インデックス: %d 値: %d\n", index, value)
} 第四行中的索引和值分别用于接收 range 关键字返回的切片中每个元素的索引和值。这里的索引和值不是固定的,读者还可以定义其他名称。
for的详细用法将在下一章《Go语言中的流程控制》中详细讲解。
上述代码的输出是:
Index: 0 Value: 10
Index: 1 Value: 20
Index: 2 Value: 30
Index: 3 Value: 40
迭代切片时,range 关键字返回两个值,如下图所示。第一个值是当前正在迭代的索引位置,第二个值是与该位置对应的元素值的副本。
需要强调的是,range 并不直接返回每个元素的引用,而是每个元素的副本,如下所示。
【示例1】range提供了每个元素的副本
// 整数のスライスを作成して値を割り当てる
slice := []int{10, 20, 30, 40}
// 各要素を繰り返して、値とアドレスを表示する
for index, value := range slice {
fmt.Printf("値: %d 値のアドレス: %X 要素のアドレス: %X\n", value, &value, &slice[index])
} 输出是:
Value: 10 Value-Addr: 10500168 ElemAddr: 1052E100
Value: 20 Value-Addr: 10500168 ElemAddr: 1052E104
Value: 30 Value-Addr: 10500168 ElemAddr: 1052E108
Value: 40 Value-Addr: 10500168 ElemAddr: 1052E10C
迭代返回的变量是迭代过程中按照切片顺序分配的新变量,因此值的地址始终相同。要获取每个元素的地址,请使用切片变量和索引值(例如上面代码中的 &slice[index])。
如果不需要索引值,也可以使用下划线_忽略该值。这是代码:
【示例2】使用空白标识符(下划线)忽略索引值
// 整数のスライスを作成し、値を割り当てる
slice := []int{10, 20, 30, 40}
// 各要素を反復処理し、その値を表示する
for _, value := range slice {
fmt.Printf("Value: %d\n", value)
} 输出是:
Value: 10
Value: 20
Value: 30
Value: 40
关键字范围始终从切片标头迭代。如果您想更好地控制迭代,可以使用传统的 for 循环。代码如下所示。
[示例 3] 使用传统的 for 循环迭代切片
// 整数のスライスを作成し、値を割り当てる
slice := []int{10, 20, 30, 40}
// 3番目の要素から要素を反復処理する
for index := 2; index < len(slice); index++ {
fmt.Printf("Index: %d Value: %d\n", index, slice[index])
} 输出是:
Index: 2 Value: 30
Index: 3 Value: 40
在上一节中,您了解了两个可用于处理数组、切片和通道的特殊内置函数:len() 和 cap()。对于切片,函数 len() 可以返回长度。函数 cap() 可以返回切片的容量。在上面的例子中,函数 len() 用于控制循环迭代的次数。
当然,range关键字不仅可以用来遍历切片,还可以用来遍历数组、字符串、映射、通道等。这将在稍后的研究中详细讨论。




![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

