for range
说明
1、for循环开始已经确认循环次数,在中间进行append,也不会对新加的进行循环
2、进行循环的是拷贝的副本,在range后面使用的是指针或者slice,在range的时候,t是从当前slice或者指针指向的是a[i],从case1和其他case的fmt.Print(t.n, " ")可以看出
3、要对当前数组或者slice,使用指针进行操作,在case3和case4可以看出
func main() {
case1()
case2()
case3()
case4()
case5()
}
type T struct {
n int
}
func case1() {
a := [2]T{}
// 复制一个数组时,次数组的所有元素被复制,t时同一个值,被赋值,开始进行for range的时候,已经拷贝一个a的副本进行循环
for i, t := range a {
switch i {
case 0:
t.n = 3
//直接在a上面操作
a[1].n = 9
case 1:
fmt.Print(t.n, " ")
}
}
fmt.Println(a)
}
func case2() {
a := [2]T{}
// 复制一个数组时,次数组的所有元素被复制,t时同一个值,被赋值,开始进行for range的时候,已经拷贝一个a的副本进行循环
// 并且已经记录需要循环的个数,在for进行append,也不会循环新加的内容
for i, t := range &a {
switch i {
case 0:
t.n = 3
a[1].n = 9
case 1:
fmt.Print(t.n, " ")
}
}
fmt.Println(a)
}
func case3() {
a := [2]T{}
// 复制一个数组时,次数组的所有元素被复制,t时同一个值,被赋值,开始进行for range的时候,已经拷贝一个a的副本进行循环
// 并且已经记录需要循环的个数,在for进行append,也不会循环新加的内容
for i := range a[:] {
t := &a[i]
switch i {
case 0:
t.n = 3
a[1].n = 9
case 1:
fmt.Print(t.n, " ")
}
}
fmt.Println(a)
}
func case4() {
a := [2]T{}
for i := range a {
t := &a[i]
switch i {
case 0:
t.n = 3
a[1].n = 9
case 1:
fmt.Print(t.n, " ")
}
}
fmt.Println(a)
}
func case5() {
a := [2]T{}
b := a[:]
for i, t := range b {
switch i {
case 0:
t.n = 3
b[1].n = 9
b = append(b, T{n: 4})
case 1:
fmt.Print(t.n, " ")
case 2:
fmt.Print(t.n, " ")
}
}
fmt.Println(a)
fmt.Println(b)
}
答案
0 [{0} {9}]
9 [{0} {9}]
9 [{3} {9}]
9 [{3} {9}]
9 [{0} {9}]
[{0} {9} {4}]
参考文档
参考老貘的for-range的用法