下面两段代码输出什么。
// 1.
func main() {
s := make([]int, 5)
s = append(s, 1, 2, 3)
fmt.Println(s)
}
// 2.
func main() {
s := make([]int, 0)
s = append(s, 1, 2, 3, 4)
fmt.Println(s)
}
// 1
[0 0 0 0 0 1 2 3]
// 2
[1 2 3 4]
解析:首先了解一下切片的结构。
// runtime/slice.go
type slice struct {
array unsafe.Pointer // 元素指针
len int // 长度
cap int // 容量
}

slice 实际上是一个结构体,包含三个字段:长度、容量、底层数组。
make([]int, 5) 等价于 make([]int, 5, 5),会创建一个 len = 5 cap = 5 的切片。s = append(s, 1, 2, 3) 会在切片长度(5)的后面增加 1, 2, 3。
底层数组[5] = 1
底层数组[6] = 2
底层数组[7] = 3
题目2 创建一个 len = 0 cap = 0 的切片。
参考资料: