-
数组
var arr [3]int // 数组的每个元素都会被初始化为改类型的零值 var a [3]int = [3]int{1,2} a[2] // 0 q := [...]int{1,2,3} // ...表示初始化时会根据初始值的个数确定数组的长度 // 数组的长度是数组的一部分,必须是常量表达式,举例来说就是长度确定后不能再给它赋值
比较两个数组是否相等,一定要长度、类型、所有元素都相等时才会相等
数组遍历
var team [3]int = [3]int{1,2} team[2] = 3 for k, v := range team { fmt.Println(k,v) }
多维数组
var array [4][2]int array = [4][2]int{{1,2}, {2,3}, {3,4}, {4,5}} // 声明并初始化索引为1,2的数组 array = [4][2]int{1: {2,3}, 2: {3, 4}} // 按维度初始化数组中指定的元素 array = [4][2]int{1: {0: 1}, 2: { 1: 4}} // 为元素赋值 array[0][0] = 1
只要类型一致,多维数组可以相互赋值
-
切片
切片默认指向一段连续内存区域,可以是数组,也可以是切片本身
表示原有的切片:
a := []int{1,2,3} fmt.Println(a[:]) // [1,2,3]
使用
a[0:0]
// []`可以清空数组声明新的切片
var stringList []string // 声明字符串切片 stringList == nil // 空切片 var empty = []int // empty != nil
切片是动态结构,只能与nil判定相等,不能互相判定相等,声明新的切片后,可以使用
append()
函数向切片中添加元素。使用内建函数make()构造切片
提前分配空间,以降低多次分配空间造成的性能问题,使用该函数生成切片必定发生了内存分配操作,但给定开始和结束为止的切片只是将新的切片结构指向已经分配好的内存区域,设定开始和结束位置,并不会发生内存分配操作。
make ([]Type, size, cap) a = make([]int, 2, 10)
使用append()为切片添加元素
var a []int
a = append(a, 1, 2)
a = append(a, []int{1,2,3}...) // 直接追加切片时需要解包
a = append([]int{1,2,3}, a...) // 开开头添加切片
// 链式操作
a= append(a[:i], append([]int{1, 2, 3}, a[i:]...)...) // 在第i个位置插入切片
为切片添加元素时,如果空间不足,切片会自动扩容,容量会按原有容量的2倍进行扩充。1,2,4,8,16……
由于append()能返回新切片的特性,所以切片也支持链式操作。
切片复制
slice1 := []int{1,2,3,4}
slice2 := []int{5,4,3,2,1}
copy(slice1, slice2)
fmt.Println(slice1) // [5,4,3,2]
切片删除
golang没有提供特定的接口,只能从切片本身的特性来删除元素,分别可以从开头位置删除、中间位置、尾部位置
a := []int{1,2,3}
a = a[N:] // 删除开头N个元素
// 或者使用append()删除开头N个元素
a = append(a[:0], append(a[:N])...)
a = a[:copy(a, a[N:])] // 将N+之后的元素拷贝过来,之前的不要了
// 删除中间N个元素
a = append(a[:i], a[i+N:]...)
a = a[:i+copy(a[i:], a[i+N:])]
// 尾部删除
a = a[:len(a) - N]
// 删除指定元素
str := []string{"a","b", "c", "d", "e"}
index := 2
str = append(str[:index], str[index + 1:]...)
fmt.Println(str) // [a b d e]
多维切片
slice := [][]int{{1,2,3}, {1,2,3}}
slice[0] = append(slice[0], 4)
多维切片操作起来会涉及众多的布局和值,相比于在函数间传递数据结构的复杂,切片由于本身结构简单的优势,在函数间传递消耗的成本很小。
网友评论