Golang中的切片和数组小记

Golang中的切片和数组小记,第1张

概述golang中的数组大概相当与C/C++中的数组,固定大小,不能够动态扩展大小,而切片大概相当与C++中的Vector,可以动态扩展大小,当大小超过容量时,重新分配一块内存,然后将数据复制到新的内存区域。 下面看一个在已有数组的基础上定义切片的例子: package mainimport ( "fmt")func main(){ a1:=[10]int{1,2,3,4,

golang中的数组大概相当与C/C++中的数组,固定大小,不能够动态扩展大小,而切片大概相当与C++中的Vector,可以动态扩展大小,当大小超过容量时,重新分配一块内存,然后将数据复制到新的内存区域。

下面看一个在已有数组的基础上定义切片的例子:


package mainimport (	"fmt")func main(){	a1:=[10]int{1,2,3,4,5,6,7,8,9,10}	s1:=a1[5:8]  // 此时s1的容量是5	s2:=a1[5:10] // 此时s2的容量也是5	s1 = append(s1,1,2,3,6)	fmt.Println(s1)	fmt.Println(s2)	fmt.Println(a1)}
上面的代码输出结果是:


[6 7 8 1 2 3 4 5 6]
[6 7 8 9 10]
[1 2 3 4 5 6 7 8 9 10]


这个结果不难看出,s1在又新添加了6个元素后,超过了原有的容量,所以必须重新分配一块内存,插入新的数据,这个时候s1对应的底层数组就不再是a1了,而是系统自己又生产了一个新的数组。


而此时s2对应的底层数组仍然是a1,所以s2中的数据没有变化。

那么再看下面一个例子:


package mainimport (	"fmt")func main(){	a1:=[10]int{1,10}	s1:=a1[5:8] // 此时s1的容量是5	s2:=a1[5:10] // 此时s2的容量也是5	s1 = append(s1,2)	fmt.Println(s1)	fmt.Println(s2)	fmt.Println(a1)}
你觉得这次的输出结果会是什么?结果是:

[6 7 8 1 2]
[6 7 8 1 2]
[1 2 3 4 5 6 7 8 1 2]


这个时候由于s1新添加的元素个数没有超过s1现在的容量,所以s1没有新开一片内存,用的还是a1数组的内存,所以s1的改变导致了a1数组的值的改变。

这是个很有趣的问题,使用切片的append函数,却导致了原有数组已有元素的改变……

所以我觉得在用数组和切片混合使用的时候,要小心才是。

测试程序使用的go版本是1.1具体版本是:

go version go1.1 linux/amd64

总结

以上是内存溢出为你收集整理的Golang中的切片和数组小记全部内容,希望文章能够帮你解决Golang中的切片和数组小记所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1292779.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存