您的位置:首页 > 编程语言 > Go语言

golang 中使用数组创建slice时的注意事项

2015-03-09 20:47 375 查看
golang中,slice是对固定长度数组的一段切片,其底层是用对数值空间的指针实现的。

在golang中当使用一个数组来创建slice时如:

[code]var array [5]int = [5]int{1,2,3,4,5}
//切割出数组中的4个值,创建一个slice
myslice := array[0:4]


打印array的值为:

[code]1, 2, 3, 4, 5


打印mysqlice的值为:

[code]1, 2, 3, 4


现在我们对myslice进行append操作

[code]myslice = append(myslice,100)


打印array的值为:

[code]1, 2, 3, 4, 100


打印mysqlice的值为:

[code]1, 2, 3, 4, 100


现在我们再对myslice进行修改操作

[code]myslice[0] = 50


打印array的值为:

[code]50, 2, 3, 4, 100


打印mysqlice的值为:

[code]50, 2, 3, 4, 100


当slice的长度没有超过创建是的数组的长度时,slice还是指向的创建时使用的数组。

但是!

现在myslice的长度已经和用来创建slice时使用的数组的长度一致了

我们再对myslice进行append操作,让myslice的长度大于创建时使用的数组的长度

[code]myslice = append(myslice,200)


打印array的值为:

[code]50, 2, 3, 4, 100


打印mysqlice的值为:

[code]50, 2, 3, 4, 100, 200


myslice不是通过指针的方式跟arr建立关联的吗?为毛这种情况却没有改变arr的值呢?

因为当myslice超出arr的长度时,Go语言会隐含式地对array做了copy,并让myslice内部的指针重新指向了新数值,所以一切预期中修改array的值的操作,都不会生效!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: