1. 数组
var a [3]int // array of 3 integersfmt.Println(a[0]) // print the first elementfmt.Println(a[len(a)-1]) // print the last element, a[2]默认情况下,数组的每个元素都被初始化为元素类型对应的零值,对于数字类型来说就是 0。
var q [3]int = [3]int{1, 2, 3}var r [3]int = [3]int{1, 2}fmt.Println(r[2]) // "0"
q := [...]int{1, 2, 3}fmt.Printf("%T\n", q) // "[3]int"数组的长度必须是常量表达式,因为数组的长度需要在编译阶段确定。
q := [3]int{1, 2, 3}q = [4]int{1, 2, 3, 4} // compile error: cannot assign [4]int to [3]int
a := [2]int{1, 2}b := [...]int{1, 2}c := [2]int{1, 3}fmt.Println(a == b, a == c, b == c) // "true false false"d := [3]int{1, 2}fmt.Println(a == d) // compile error: cannot compare [2]int == [3]int2. 切片(Slice)
指针指向第一个 slice 元素对应的底层数组元素的地址,要注意的是 slice 的第一个元素并不一定就是数组的第一个元素。 长度对应 slice 中元素的数目; 长度不能超过容量,容量一般是从 slice 的开始位置到底层数据的结尾位置。内置的 len 和 cap 函数分别返回 slice 的长度和容量。
months := [...]string{1: "January", /* ... */, 12: "December"}
通常,数组的第一个元素从索引 0 开始,但是月份一般是从 1 开始的,因此我们声明数组时直接跳过第 0 个元素,第 0 个元素会被自动初始化为空字符串。

Q2 := months[4:7]summer := months[6:9]fmt.Println(Q2) // ["April" "May" "June"]fmt.Println(summer) // ["June" "July" "August"]两个 slice 都包含了六月份。
append 函数
var runes []runefor _, r := range "Hello, 世界" { runes = append(runes, r)}fmt.Printf("%q\n", runes) // "['H' 'e' 'l' 'l' 'o' ',' ' ' '世' '界']"
func main() {var x, y []intfor i := 0; i < 10; i++ {y = appendInt(x, i)fmt.Printf("%d cap=%d\t%v\n", i, cap(y), y)x = y}}//每一次容量的变化都会导致重新分配内存和copy操作:0 cap=1 [0]1 cap=2 [0 1]2 cap=4 [0 1 2]3 cap=4 [0 1 2 3]4 cap=8 [0 1 2 3 4]5 cap=8 [0 1 2 3 4 5]6 cap=8 [0 1 2 3 4 5 6]7 cap=8 [0 1 2 3 4 5 6 7]8 cap=16 [0 1 2 3 4 5 6 7 8]9 cap=16 [0 1 2 3 4 5 6 7 8 9]

