1. 程式人生 > 其它 >golang 切片原理面試題

golang 切片原理面試題

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,就自然打印出了整個原陣列了。

本文參考資料:

  1. https://zhuanlan.zhihu.com/p/29753411
  2. https://draveness.me/golang/docs/part2-foundation/ch03-datastructure/golang-array-and-slice/#324-追加和擴容