golang中的数组是一种由固定长度和固定对象类型所组成的数据类型。例以下面: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时,则表明着这个数组第一个元素的指针。数组
letters := []string{"a", "b", "c", "d"}
数组声明时候方括号内须要写明数组的长度或者使用(...)符号自动计算长度,切片不须要指定数组的长度。比较规范的声明方式是使用make,大体有两种方式app
一、只指定长度,这个时候切片长度和容量相同;函数
二、同时指定切片的长度和容量。指针
var s1 = make([]byte, 5) var s2 = make([]byte, 5, 10)
因为切片是 引用类型 ,所以当引用改变其中元素的值时候,其余的全部引用都会改变该值。例如code
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]get
[100 5 6 7]
从概念上看,切片像是一个结构体,包含了三个元素:
一、一个指向数组中切片指定的开始位置;
二、长度,即切片的长度,经过内置函数len得到;
三、最大长度,即切片的最大容量,经过内置函数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个位置