看到 go/ast 源碼包中有這麼一段代碼:git
var objKindStrings = [...]string{ Bad: "bad", Pkg: "package", Con: "const", Typ: "type", Var: "var", Fun: "func", Lbl: "label", }
谷歌搜了一下,3 dots in 4 places 這篇文章介紹了「三點」語法在四個不一樣場景的使用。其中提到:github
Array literals
In an array literal, the
...
notation specifies a length equal to the number of elements in the literal.golangstooges := [...]string{"Moe", "Larry", "Curly"} // len(stooges) == 3
看完我還沒反應過來,這跟 []string
有啥區別?後來才注意到 array 字眼,每天用 slice 都忘了 array 的存在。數據結構
[...]string
是 array,而 []string
是 slice。[...]string
是 [n]string
的便捷寫法,n = arr 元素個數。性能
寫段代碼驗證一下:url
func main() { a := [...]string{"a", "b", "c", "d"} b := []string{"a", "b", "c", "d"} atype := reflect.TypeOf(a) btype := reflect.TypeOf(b) fmt.Println(atype.Kind(), atype) fmt.Println(btype.Kind(), btype) }
輸出:code
array [4]string slice []string
在這種常量場景用 [...]
還真是挺方便,修改元素個數,自動調整 array 長度。three
至於爲何用 array 而不是 slice,應該是出於性能考慮,slice 封裝自 array 之上,雖然使用便捷,可是數據結構更復雜,性能也更差。Go 源碼做者真是細節到位。ip
你學廢了嗎?ci