看到 go/ast 有这么一段代码:

var objKindStrings = [...]string{   Bad: "bad", Pkg: "package", Con: "const", Typ: "type", Var: "var", Fun: "func", Lbl: "label",}

谷歌搜了一下,3 dots in 4 places 这篇文章介绍了“三点”语法在四个不同场景的应用。其中提到:

Array literals

In an array literal, the ... notation specifies a length equal to the number of elements in the literal.

stooges := [...]string{"Moe", "Larry", "Curly"} // len(stooges) == 3

看完我还没反馈过去,这跟 []string 有啥区别?

起初才留神到 array 字眼,[...]string 是 array,而 []string 是 slice。[...]string[n]string 的便捷写法,n = arr 元素个数。

写段代码验证一下:

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)}

输入:

array [4]stringslice []string

在这种常量场景用 [...] 还真是挺不便,批改元素个数,主动调整 array 长度。

至于为什么用 array 而不是 slice,应该是出于性能思考,slice 封装自 array 之上,尽管应用便捷,然而数据结构更简单,性能也更差。Go 源码作者真是细节到位。

你学废了吗?