美文网首页
07 | 数组与切片

07 | 数组与切片

作者: 刀斧手何在 | 来源:发表于2020-03-21 18:15 被阅读0次

数组

  • 声明数组需指定元素类型和元素个数
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

  • 声明切片几种方式
  1. 直接声明
func TestSlice(t *testing.T) {
    var slice []int
    t.Log(reflect.TypeOf(slice))
}
//result : []int
  1. 声明并赋字面值
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
  1. 从数组或切片中切出
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

推荐阅读

相关文章

网友评论

      本文标题:07 | 数组与切片

      本文链接:https://www.haomeiwen.com/subject/plujthtx.html