(二)golang数组和切片

一、数组

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个位置

切片详解

http://www.jianshu.com/p/030a...

相关文章
相关标签/搜索