乐趣区

关于golang:Go-里面-stringa-b-c-加三个点是什么骚写法

看到 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]string
slice []string

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

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

你学废了吗?

退出移动版