数组与slice

问题:下面这段代码输出什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)
}

答案:

1
2
r =  [1 12 13 4 5]
a = [1 12 13 4 5]

原因:

​ 这一题与前面的 for - range很相似,一眼就能看出来,因为for-range执行前是将原数组进行拷贝,所以在循环里改变的数组,是不会影响到我们循环时的副本的,所以答案为:

1
2
r =  [1 2 3 4 5]
a = [1 12 13 4 5]

​ 但事实并非如此,我们在之前的题目中,a是数组,而在这里a是slice。slice是引用类型,故其是一个指向底层数组的指针,因此我们在循环使用的副本依旧是一个指向原底层数组的副本,故对切片所有的操作,都会影响到底层数组,所以考研通过v获得修改后的数组元素。

​ 你学会了吗?


数组与slice
http://example.com/2023/04/21/Go每日一题/切片/
作者
Feng Tao
发布于
2023年4月21日
更新于
2023年4月21日
许可协议