数组array
array是固定长度的数组,这个和C语言中的数组是一样的,使用前必须确定数组长度。但是和C中的数组相比,又是有一些不同的:
1. Go中的数组是值类型,换句话说,如果你将一个数组赋值给另外一个数组,那么,实际上就是将整个数组拷贝一份
2. 如果Go中的数组作为函数的参数,那么实际传递的参数是一份数组的拷贝,而不是数组的指针。这个和C要区分开。因此,在Go中如果将数组作为函数的参数传递的话,那效率就肯定没有传递指针高了。这个是不是有点陷阱的感觉?
3. array的长度也是Type的一部分,这样就说明[10]int和[20]int是不一样的。
自己理解:
1. 数组有点像是个固定长度,内部数据都是同样类型的结构体。
2. 数组名不能当做指针来用!!
slice
1 slice是可变长的
定义完一个slice变量之后,不需要为它的容量而担心,你随时可以往slice里面加数据
比如:
v:=[]string{}
v=append(v, "hello")
这里附带说一下,slice和array的写法很容易混
v:=[2]string{"str1", "str2"} //这个是array
m:=[]string{"str1","str2"} //这个是slice
写法上默念:array有长度slice没长度,array有长度slice没长度…
2 slice是一个指针而不是值。
指针比值可就小多了,因此,我们将slice作为函数参数传递比将array作为函数参数传递会更有性能。
slice是一个指针,它指向的是一个array机构,它有两个基本函数len和cap。
看下面的图示:
slice是一个带有point(指向数组的指针),Len(数组中实际有值的个数),Cap(数组的容量)
比如上面的这个slice,它指向的数组是[3]int,其中的前两个有值,第三个为空
那么
len(slic) = 2
cap(slic) = 3
append函数就理解为往slice中加入一个值,如果未达到容量(len<cap)那么就直接往数组中加值,如果达到容量(len = cap)那么就增加一个新的元素空间,将值放在里面
个人理解:
如果真的想用数组,应该用slice
参考:http://www.cnblogs.com/yjf512/archive/2012/06/14/2549929.html
有疑问加站长微信联系(非本文作者)