append 函数
- append 函数也是内置函数,它可以将元素添加到 slice 里面。
package mainimport "fmt"func main() { dwarfs := []string{"Ceres", "Pluto", "Haumea", "Makemake", "Eris"} dwarfs = append(dwarfs, "Orcus") fmt.Println(dwarfs) dwarfs = append(dwarfs, "Salacia", "Quaoar", "Sedna") fmt.Println(dwarfs)}
长度和容量(length & capacity)
- Slice 中元素的个数决定了 slice 的长度。
- 如果 slice 的底层数组比 slice 还大,那么就说该 slice 还有容量可供增长。
package mainimport "fmt"// dump slice length, capacity, and contentsfunc dump(label string, slice []string) { fmt.Printf("%v: length %v, capacity %v %v\n", label, len(slice), cap(slice), slice)}func main() { dwarfs := []string{"Ceres", "Pluto", "Haumea", "Makemake", "Eris"} dump("dwarfs", dwarfs) dump("dwarfs[1:2]", dwarfs[1:2])}
详解 append

package mainimport "fmt"func dump(label string, slice []string) { fmt.Printf("%v: length %v, capacity %v %v\n", label, len(slice), cap(slice), slice)}func main() { dwarfs1 := []string{"Ceres", "Pluto", "Haumea", "Makemake", "Eris"} dwarfs2 := append(dwarfs1, "Orcus") dwarfs3 := append(dwarfs2, "Salacia", "Quaoar", "Sedna") dump("dwarfs1", dwarfs1) dump("dwarfs2", dwarfs2) dump("dwarfs3", dwarfs3) dwarfs3[1] = "Pluto!" dump("dwarfs1", dwarfs1) dump("dwarfs2", dwarfs2) dump("dwarfs3", dwarfs3)}
三个索引的切分操作
- Go 1.2 中引入了能够限制新建切片容量的三索引切分操作。
package mainimport "fmt"// dump slice length, capacity, and contentsfunc dump(label string, slice []string) { fmt.Printf("%v: length %v, capacity %v %v\n", label, len(slice), cap(slice), slice)}func main() { planets := []string{ "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", } terrestrial := planets[0:4:4] worlds := append(terrestrial, "Ceres") fmt.Println(planets) dump("terrestrial", terrestrial) terrestrial = planets[0:4] worlds = append(terrestrial, "Ceres") fmt.Println(planets) dump("terrestrial", terrestrial) _ = worlds}
使用 make 函数对 slice 进行预分配
- 当 slice 的容量不足以执行 append 操作时,Go 必须创建新数组并复制旧数组中的内容。
- 但通过内置的 make 函数,可以对 slice 进行预分配策略。
package mainimport "fmt"func main() { dwarfs := make([]string, 0, 10) dwarfs = append(dwarfs, "Ceres", "Pluto", "Haumea", "Makemake", "Eris") fmt.Println(dwarfs)}
声明可变参数的函数
- 声明 Printf、append 这样的可变参数函数,需要在函数的最后一个参数前面加上 … 符号。
package mainimport "fmt"func terraform(prefix string, worlds ...string) []string { newWorlds := make([]string, len(worlds)) for i := range worlds { newWorlds[i] = prefix + " " + worlds[i] } return newWorlds}func main() { twoWorlds := terraform("New", "Venus", "Mars") fmt.Println(twoWorlds) planets := []string{"Venus", "Mars", "Jupiter"} newPlanets := terraform("New", planets...) fmt.Println(newPlanets)}
作业
- 编写一个程序:
- 通过循环,持续的将元素追加到 slice 里
- 在 slice 容量发生变化的时候打印出它的容量
- 请判断 append 函数在底层数组的空间被填满之后,是否会将数组的容量增加一倍?
package mainimport "fmt"func main() { s := []string{} lastCap := cap(s) for i := 0; i < 10000; i++ { s = append(s, "An element") if cap(s) != lastCap { fmt.Println(cap(s)) lastCap = cap(s) } }}