下面这段代码输出什么?
func main() {
var a = [5]int{1, 2, 3, 4, 5}
var r [5]int
for i, v := range a {
if i == 0 {
a[1] = 12
a[2] = 13
}
r[i] = v
}
fmt.Println("r = ", r)
fmt.Println("a = ", a)
}
下面这段代码输出什么?
func main() {
var a = [5]int{1, 2, 3, 4, 5}
var r [5]int
for i, v := range a {
if i == 0 {
a[1] = 12
a[2] = 13
}
r[i] = v
}
fmt.Println("r = ", r)
fmt.Println("a = ", a)
}
`单行代码`
r = 1 2 3 4 5 a = 1 12 13 4 5
数组非引用类型
到
mark
mark
m
mark
di
r 的结果为: 1,2,3,4,5
a的结果为: 1,12,13,4,5
2022-04-26
range 表达式是副本参与循环,并且数组非引用类型
m
打卡。range循环副本
mark
a如果是slice就不一样。形如b := a,如果a是slice,则b为引用,如果a是数组,b是整个复制
mk
这个对3天前那个题目做了扩展解释
【1 2 3 4 5 】【1 12 13 4 5】遍历的是快照
range 副本操作。
mark
mark
1
1
mark
func main() { var a = [5]int{1, 2, 3, 4, 5} var r [5]int
} r = [1 2 3 4 5] a = [1 12 13 4 5] range 是 a 的副本 不是a本身 func main() { var a = [5]int{1, 2, 3, 4, 5} var r [5]int
} r = [1 12 13 4 5] a = [1 12 13 4 5]
111111
mark
1
mark
mark
mark
打卡
range 中遍历数据是一个数组的一个副本!如果想修改立即生效就赋一个地址进去!
mark
mark
打卡
range 表达式是副本参与循环,就是说例子中参与循环的是 a 的副本,而不是真正的 a。
打卡
mark
mark
m
mark
m
m
range知识点考察
mark
m
m
本来具备有疑惑:为什么 for range 循环拷贝的是 a 的副本,那什么修改a时会生效呢,自己认为 a 就是已经拷贝后的副本 答案:for range 拷贝的副本没有显式调用,也也就是其在 i,v 和遍历次数上做了一定的出口限制。所以导致 r 仍然是原值。 尽管其在内部对 a 进行了修改,但不会遍历到那些被修改后的数据。
mark