1、数组
golang中的数组是一种由固定长度和固定对象类型所组成的数据类型。例如下面:
var a [4]int
a是一个拥有4个int类型元素的数组。当a一旦被声明之后,元素个数就被固定了下来,在a这个变量的生命周期之内,元素个数不会发生变化。而此时a的类型就是[4]int,如果同时存在一个b变量,为[5]int。即便两个变量仅仅相差一个元素,那么在内存中也占据着完全不同的地址分配单元,a和b就是两个完全不同的数据类型。在golang中,数组一旦被定义了,那么其内部的元素就完成了初始化。也就是时候a[0]等于0。
在golang当中,一个数组就是一个数据实体对象。在golang当使用a时,就代表再使用a这个数组。而在C中,当使用a时,则代表着这个数组第一个元素的指针。
2、切片
letters := []string{"a", "b", "c", "d"}
数组声明时候方括号内需要写明数组的长度或者使用(…)符号自动计算长度,切片不需要指定数组的长度。比较规范的声明方式是使用make,大致有两种方式
1、只指定长度,这个时候切片长度和容量相同;
2、同时指定切片的长度和容量。
var s1 = make([]byte, 5)
var s2 = make([]byte, 5, 10)
由于切片是 引用类型 ,因此当引用改变其中元素的值时候,其他的所有引用都会改变该值。例如
var a = []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
s1 := a[:4]
s2 := a[3:7]
fmt.Println(s1)
fmt.Println(s2)
s1[3] = 100
fmt.Println(s1)
fmt.Println(s2)
结果是:
[1 2 3 4]
[4 5 6 7]
[1 2 3 100]
[100 5 6 7]
从概念上看,切片像是一个结构体,包含了三个元素:
1、一个指向数组中切片指定的开始位置;
2、长度,即切片的长度,通过内置函数len获得;
3、最大长度,即切片的最大容量,通过内置函数cap获得。
如果len比cap还大,那么就会触发运行时异常。
golang提供append函数来添加元素,当使用append函数时,append函数会判断目的切片是否具有剩余空间,如果没有剩余空间,则会自动扩充两倍空间。
golang提供copy用于将内容从一个数组切片复制到另一个数组切片。如果加入的两个数组切片不一样大,就会按其中较小的那个数组切片的元素个数进行复制。
slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}
copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中
copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置