Golang中的切片和数组小记
golang中的数组大概相当与C/C++中的数组,固定大小,不能够动态扩展大小,而切片大概相当与C++中的Vector,可以动态扩展大小,当大小超过容量时,重新分配一块内存,然后将数据复制到新的内存区域。 下面看一个在已有数组的基础上定义切片的例子: package main import ( "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] 而此时s2对应的底层数组仍然是a1,所以s2中的数据没有变化。 那么再看下面一个例子: package main import ( "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] 这个时候由于s1新添加的元素个数没有超过s1现在的容量,所以s1没有新开一片内存,用的还是a1数组的内存,所以s1的改变导致了a1数组的值的改变。 这是个很有趣的问题,使用切片的append函数,却导致了原有数组已有元素的改变…… 所以我觉得在用数组和切片混合使用的时候,要小心才是。 测试程序使用的go版本是1.1具体版本是: go version go1.1 linux/amd64 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |