场景 1
// s 为 []int, capacity 未知。
s1 := append(s, 9)
s2 := append(s, 12)
s1 和 s2 的值未知,s[0]
可能是 12,也有可能是9。如果在 append 一个元素之后 s
不会扩容,那么 s1[len(s)]
的值将会是12。
场景 2
关于 slice 的 cap 究竟是多少的问题。
s := []int{} // cap == 0
s := make([]int{}, 0, 1) // cap == 1
s := []byte{} // cap == 0
逃逸情况的 cap
func capVal() []byte {
raw := ""
s := []byte(raw)
s2 := []byte(raw)
fmt.Printf("s cap: %d, s2 cap: %d.\n", cap(s), cap(s2))
return s2
}
// s cap: 32, s2 cap: 0.
这里特别要小心,因为函数 capVal
返回了 s2
,因此 s2
被视作逃逸变量,因此和在栈上的变量 s
,使用了不同的初始化 capacity。
很好的一篇参考资料: Go中string转[]byte的陷阱
上述两个场景都是公司同事在实际代码中发现的 bug(或者说,Go 的小陷阱),需要留意。
相关文章
暂无评论...