关键字range可用于循环,类似迭代器操作,它可以遍历slice,array,string,map和channel,可以使用”_”来忽略不想要的返回值。
通过 for range 遍历的返回值有一定的规律:
- 数组、切片、字符串返回索引和值。
- map 返回键和值。
- 通道(channel)只返回通道内的值。
需要要注意的是,val 始终为集合中对应索引的值拷贝,因此它一般只具有只读性质,对它所做的任何修改都不会影响到集合中原有的值。
如:
package main
import "fmt"
func main() {
str1 := []string{"1", "2", "3", "4"}
for _, value := range str1 {
if value == "2" || value == "4" {
value = "6"
}
}
fmt.Println(str1)
}
这种操作是不会对原有数据产生影响的。
如果想要改变,可参考下面的操作
type T struct {
n int
}
func main() {
ts := [2]T{}
for i, t := range ts {
switch i {
case 0:
t.n = 3
ts[1].n = 9
case 1:
fmt.Print(t.n, " ")
}
}
fmt.Print(ts)
}
输出 0 [{0} {9}]
for-range 循环数组,此时使用的是数组 ts 的副本,所以 t.n = 3 的赋值操作不会影响原数组,而ts[1].n=9,直接对原有数组进行赋值是会产生影响的。
type T struct {
n int
}
func main() {
ts := [2]T{}
for i, t := range &ts {
switch i {
case 0:
t.n = 3
ts[1].n = 9
case 1:
fmt.Print(t.n, " ")
}
}
fmt.Print(ts)
}
输出 9 [{0} {9}]
for-range 数组指针。for-range 循环中的循环变量 t 是原数组元素的副本。如果数组元素是结构体值,则副本的字段和原数组字段是两个不同的值。
网友评论