数组
- 声明数组需指定元素类型和元素个数
func TestArray(t *testing.T){
arr := [3]int{1,2,3}
t.Log(arr)
}
//result : [1,2,3]
- 初始化赋值元素个数要小于,或等于指定个数。没有初始化的元素,默认赋零值
func TestArray(t *testing.T){
arr := [3]int{}
t.Log(arr)
}
//result : [0,0,0]
- 可使用
...
忽略设置元素个数,自动根据初始化元素分配对应长度数组
func TestArray(t *testing.T){
arr := [...]int{}
arr2 := [...]int{1,0}
t.Log(arr,arr2)
}
//result : [] [1,0]
- 使用
cap()
,len()
查看数组大小,go语言数组不能扩容
func TestArray(t *testing.T){
arr := [...]int{1,0}
t.Log(arr,cap(arr),len(arr))
}
//result : [1 0] 2 2
- 函数参数和返回值定义必须指定具体元素个数
func getLen(arr [...]int) int {
return len(arr)
}
func TestArray(t *testing.T){
arr := [...]int{1,0}
t.Log(getLen(arr))
}
//result : use of [...] array outside of array literal
func getLen(arr [2]int) int {
return len(arr)
}
func TestArray(t *testing.T){
arr := [...]int{1,0}
t.Log(getLen(arr))
}
//result : 2
原因: ...
自动推导个数必须在编译时确定,函数行参无法在编译时确定元素个数?
所以Go语言中常用的是函数传切片而不是传数组
- 支持多维数组
切片
A slice, on the other hand, is a dynamically-sized, flexible view into the elements of an array
- 声明切片几种方式
- 直接声明
func TestSlice(t *testing.T) {
var slice []int
t.Log(reflect.TypeOf(slice))
}
//result : []int
- 声明并赋字面值
func TestSlice(t *testing.T) {
slice := []int{1,2,3,4}
t.Log(slice)
t.Log(reflect.TypeOf(slice))
}
//result: [1,2,3,4] []int
- 从数组或切片中切出
func TestSlice(t *testing.T) {
arr := [...]int{1,2,3,4}
slice := arr[0:3]
slice2 := slice[1:2]
t.Log(slice,slice2)
t.Log(reflect.TypeOf(slice),reflect.TypeOf(slice))
}
- 不允许创建容量比长度小的切片
- 切片只有底层数组有关
- 使用append增加元素 切片允许扩容
- 指定第三个参数限制切片容量
- 空切片和nil 切片 if==nil