Go 裏面 [...]string{"a", "b", "c"} 加三個點是什麼騷寫法?

看到 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.golang

stooges := [...]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

相關文章
相關標籤/搜索