数组在定义时就已经确定了大小,之后不可变,所以通过append函数添加的内容被存到了其他地方。
package main
import (
"fmt"
)
func dump(label string, slice []string) {
fmt.Printf("%v: length %v, capacity %v %v\n", label, len(slice),
cap(slice), slice) //cap(xx):读取xx的容量
}
func main() {
dwarfs := []string{"Ceres", "Pluto", "Haumea", "Makemake", "Eris"}
dump("dwarfs", dwarfs)
dump("dwarfs[1:2]", dwarfs[1:2])
}
三个索引的切分操作:
该操作可以限制新建切片容量,例程如下
package main
import (
"fmt"
)
func dump(label string, slice []string) {
fmt.Printf("%v: length %v, capacity %v %v\n", label, len(slice),
cap(slice), slice) //cap(xx):读取xx的容量
}
func main() {
planets := []string{
"Mercury","Venus","Earth","Mars",
"Jupiter","Saturn","Uranus","Neptune"
}
terrestrial := planets[0:4:4]
worlds := append(terrestrial,"Ceres")
dump("planets",planets)
dump("worlds",worlds)
}
使用make函数对slice进行预分配
当slice的容量不足以执行append操作时,Go必须创建新数组并复制旧数组中的内容。但通过内置的make函数,可以对slice进行预分配策略(尽量避免额外的内存分配和数组复制操作)
下面再看一个简单的案例:
package main
import (
"fmt"
)
func dump(label string, slice []string) {
fmt.Printf("%v: length %v, capacity %v %v\n", label, len(slice),
cap(slice), slice) //cap(xx):读取xx的容量
}
func main() {
//make():内置函数,可以对slice进行预分配策略。
dwarfs := make([]string, 0, 10) //当分配的容量小于要存储的容量时,系统会自动增加分配
dump("dwarfs",dwarfs)
dwarfs = append(dwarfs,"Ceres","Pluto","Haumea","Makemake","Eris")
dump("dwarfs",dwarfs)
}
注意,若想声明Printf、apeend这样的可变参数函数,需要在函数的最后一个参数前面加上“...”符号。以下是一个自定义函数的示例,里面的“worlds”变量就是可变参数,可以通过一系列操作改变worlds的值
package main
import (
"fmt"
)
// 声明Printf、apeend这样的可变参数函数,需要在函数的最后一个参数前面加上...符号
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() {
planets := []string{"Venus", "Mars", "Jupiter"}
newPlanets := terraform("New", planets...)
fmt.Println(newPlanets)
}
运行结果如下: