go数据类型-切片

概念

切片类似于PHP可操作的所以数据,属于go中可动态改变的特殊数组

切片在go中是一个新的数据类型,与数组最大的不同在于,切片的类型字面量中只有元素的类型,没有长度

切片有三种创建方式: 基于数组,数组切片,直接创建

切片在内存中的组织方式实际上是一个有 3 个域的结构体:指向相关数组的指针,切片 长度以及切片容量。下图给出了一个长度为 2,容量为 4 的切片

var x = []int{2, 3, 5, 7, 11}

y := x[1:3] //右边不包括 3,5

创建切片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func main() {
//基于数组创建切片
b:= []int{1,2,3,4,5} //数组切片
a := b[2:]
//基于数组切片创建切片
d := a[1:]
fmt.Println(d)
fmt.Println(a) //[3 4 5]
a[1] = 3 //可动态修改,同步的b中的b[3]也为被改为4,因为切片是指向指针的,并不是变量的拷贝
fmt.Println("a切片:",a) //a切片: [3 3 5]
fmt.Println("b数组:",b) //b数组: [1 2 3 3 5]

//make直接创建数组切片
var c = make([]int,5,10)
//动态添加元素,即使范围比定义好的范围大也可以
//append() 函数并不会改变原来的切片,而是会生成一个容量更大的切片,然后把原有的元素和新元素一并拷贝到新切片中,默认情况下,扩容后新切片的容量将会是原切片容量的 2 倍,
// 如果还不足以容纳新元素,则按照同样的操作继续扩容,直到新容量不小于原长度与要追加的元素数量之和。但是,当原切片的长度大于或等于 1024 时,Go 语言将会以原容量的 1.25 倍作为新容量的基准。
//因此,如果实现能预估切片的容量并在初始化时合理地设置容量值,可以大幅降低切片内部重新分配内存和搬送内存块的操作次数,从而提高程序性能。
var newC = append(c,1,3,4)
c = append(c,newC...)
fmt.Println(len(c))
}

切片的长度和容量需要特别注意下,len()可以获取切片的容量,cap()可以获取切片的真实长度

增加元素

1
2
3
4
5
6
7
8
9
10
11
func main() {
//make直接创建数组切片
var c = make([]int,5,10)
//动态添加元素,即使范围比定义好的范围大也可以
//append() 函数并不会改变原来的切片,而是会生成一个容量更大的切片,然后把原有的元素和新元素一并拷贝到新切片中,默认情况下,扩容后新切片的容量将会是原切片容量的 2 倍,
// 如果还不足以容纳新元素,则按照同样的操作继续扩容,直到新容量不小于原长度与要追加的元素数量之和。但是,当原切片的长度大于或等于 1024 时,Go 语言将会以原容量的 1.25 倍作为新容量的基准。
//因此,如果实现能预估切片的容量并在初始化时合理地设置容量值,可以大幅降低切片内部重新分配内存和搬送内存块的操作次数,从而提高程序性能。
var newC = append(c,1,3,4)
c = append(c,newC...)
fmt.Println(len(c))
}

遍历数组切片

1
2
3
4
5
6
for i := 0; i < len(a); i++ {
fmt.Println("a[", i, "] =", summer[i])
}
for i, v := range a {
fmt.Println("a[", i, "] =", v)
}