06-数组和切片

52 阅读1分钟

数组的声明

var a [3]int // 声明并初始化为默认值
a[0] = 1

b := [3]int{1,2,3} // 声明同时初始化
c := [2][3]int{{1,2}, {3,4}}

数组的截取

a[开始索引(包含), 结束索引(不包含)]

a := [...]int{1,23,3,4,5}
a[1:2] // 23
a[1:3] // 2,3
a[1:len(a)] // 23,3,4,5
a[1:] // 23,3,4,5
a[:3] // 1,2,3

切片内部结构

image.png

切片的声明

var s0 []int
t.Log(len(s0), cap(s0))
s0 = append(s0, 1)
t.Log(len(s0), cap(s0))

s1 := []int{1, 2, 3, 4}

t.Log(len(s1), cap(s1))

s2 := make([]int, 3, 5)
t.Log(len(s2), cap(s2))
t.Log(s2[0], s2[1], s2[2], s2[3])
s2 = append(s2, 1)
t.Log(s2[0], s2[1], s2[2], s2[3])
t.Log(len(s2), cap(s2))

切片共享存储结构

image.png

func TestSliceGrowing(t *testing.T) {
    s := []int{}
    for i := 0; i < 10; i++ {
            s = append(s, i)
            t.Log(len(s), cap(s))
    }
}
func TestSliceShareMemory(t *testing.T) {
    year := []string{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}
    Q2 := year[3:6]
    t.Log(Q2, len(Q2), cap(Q2))
    summer := year[5:8]

    t.Log(summer, len(summer), cap(summer))
    summer[0] = "Unknown"
    t.Log(Q2)
    t.Log(summer)
    t.Log(year)
}

数组 VS 切片

  1. 容量是否可伸缩
  2. 是否可以进行比较
func TestSliceCompaing(t *testing.T) {
    a := []int{1, 2, 3, 4}
    b := []int{1, 2, 3, 4}
    if a == b { // 直接就报错:slice can only be compared to nil
            t.Log("equal")
    }
}