golang append的一个坑
今天又踩到append函数的一个坑了,概况起来,如下
package main
import (
"fmt"
)
func main() {
var s = make([]string, 10)
s = append(s, "aaa")
fmt.Printf("s[0]=[%s]\n", s[0])
}
运行结果为:
$ go build && ./main
s[0]=[]
What? 难道不应该输出 s[0]=[aaa]
吗?
修改一下代码,把所有元素打出来:
package main
import (
"fmt"
)
func main() {
var s = make([]string, 10)
s = append(s, "aaa")
fmt.Printf("s[0]=[%s]\n", s[0])
for i, v := range s {
fmt.Printf("s[%d]=[%s]\n", i, v)
}
}
结果是:
$ go build && ./main
s[0]=[]
s[0]=[]
s[1]=[]
s[2]=[]
s[3]=[]
s[4]=[]
s[5]=[]
s[6]=[]
s[7]=[]
s[8]=[]
s[9]=[]
s[10]=[aaa]
"aaa"怎么是第s[10]的元素呢,前面s[0]~s[9]都是空串。
原因append总是在当前slice的最后添加元素,当我们用 var s = make([]string, 10)
初始化s的时候,就已经为s创建了10个元素,每一个元素的值都是空串,调用append函数的时候会发现此时s已经有10个元素了,所有"aaa"会被添加进第11个元素。