下面这段代码输出什么?
func main() {
var a = []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 = []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)
}
`单行代码`
mark
ok
学到了
数组和切片用
range
的遍历赋值不同,看来range
要好好研究了。m
mark
虽然 range 表达式发生复制时,但是副本的指针依旧指向原底层数组
mark
这是26号的题呀
学习了,被教育了
mark
di
当 range 表达式发生复制时,副本的指针依旧指向原底层数组
mark
mark
切片在 go 的内部结构有一个指向底层数组的指针,当 range 表达式发生复制时,副本的指针依旧指向原底层数组,所以对切片的修改都会反应到底层数组上,所以通过 v 可以获得修改后的数组元素。
当 range 表达式发生复制时,切片副本的指针依旧指向原底层数组,而数组副本指向新的数组。
踩坑了,打卡
kao
1
mark
切片循环修改底层数组 立马见效的
这道题是昨天第二题的一个解决办法,这的 a 是一个切片,那切片是怎么实现的呢?切片在 go 的内部结构有一个指向底层数组的指针,当 range 表达式发生复制时,副本的指针依旧指向原底层数组,所以对切片的修改都会反应到底层数组上,所以通过 v 可以获得修改后的数组元素。
切片和数组还是有很大的不同的
mark
打卡
mark
mark
mark
https://studygolang.com/interview/question/ve6ij4mfk00
mark
切片内部是一个struct包含一个底层数组指针 只要不发生扩容 里面的元素修改都会发生变化
[0 12 13 4 5] [0 12 13 4 5] a是切片,快照模式是a的指针,所以底层的数组还是会改动。
mark
mark
mark
mark
r = [1 12 13 4 5] a = [1 12 13 4 5] 这道题是昨天第二题的一个解决办法,这的 a 是一个切片,那切片是怎么实现的呢?切片在 go 的内部结构有一个指向底层数组的指针,当 range 表达式发生复制时,副本的指针依旧指向原底层数组,所以对切片的修改都会反应到底层数组上,所以通过 v 可以获得修改后的数组元素。
mark
mark 学到了
细节啊 平时还是要多思考 应该想到的
mark
mark
当 range 表达式发生复制时,副本的指针依旧指向原底层数组