golang 切片原理面試題
阿新 • • 發佈:2022-03-22
package main
import "fmt"
func main() {
var s = make([]int, 0, 10)
_ = append(s, 1,2,3)
fmt.Println(s)
fmt.Println(s[0:cap(s)])
}
第一次列印和第二次列印分別是什麼值了?
第一次列印:[]
第二次列印:[1 2 3 0 0 0 0 0 0 0]
原因: 當append返回的新切片不需要賦值回原有的變數時, 原始碼此時執行如下:
ptr, len, cap := slice newlen := len + 3 if newlen > cap { ptr, len, cap = growslice(slice, newlen) newlen = len + 3 } *(ptr+len) = 1 *(ptr+len+1) = 2 *(ptr+len+2) = 3 return makeslice(ptr, newlen, cap)
很明顯s的長度加上3之後此時還是不會擴容。所以切片引用的還是原陣列。
但是第一次列印的s因為len還是0,所以此時自然打印出[]。
而第二次列印的s因為字面量建立,此時的長度變為了10,就自然打印出了整個原陣列了。
本文參考資料: