x:= [...] string {“Sat”,“Sun”} vs x:= [] string {“Sat”,“Sun”}

时间:2013-11-27 23:05:34

标签: go variadic-templates

在go lang spec中,他们在其中一个例子中使用了三个点:

days := [...]string{"Sat", "Sun"}  // len(days) == 2

如果省略三个点会有什么不同吗?

1 个答案:

答案 0 :(得分:24)

它会产生很大的差异:差异在arrayslice之间。

[]string创建一个指向字符串数组的切片。另一方面,[...]创建实际字符串数组。

关于golang博客上两者之间的区别,有一个很棒的blog post。我会尽力在这里总结一下。

golang中的数组类似于值类型,它们是对特定类型的引用,并且始终具有特定的长度。创建数组有两种方法:1)具有显式长度和2)隐式长度:

// Explicit length. 
var days := [7]string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }

// Implicit length. (Let the compiler figure it out how long it is)
var days := [...]string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" } 

这些都是等效的数组定义。请注意,数组的长度是其类型定义的 part 。因此,无法交换具有不同长度的相似类型的数组:

// These two are not interchangeable!
var someArray [5]string;
var otherArray [10]string;

func work(data [5]string) { /* ... */ }

work(someArray)  // good
work(otherArray) // not so good

另请注意,数组(如结构体)将作为值传递 - 数组的副本将提供给函数,而不是对它的引用。

另一方面,切片就像参考类型。它们由数组支持,但它们更具有可塑性。它们包括指向数组中位置的指针,长度和容量。

// Create a slice
var days := []string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }

与数组不同,切片没有明确地绑定到它们的长度,并且不同长度的切片可以相互传递。它们也更像是一个指针,这意味着它们通过引用而不是值传递。

关于Go Data Structures还有一篇很棒的文章,它们是如何在内存中呈现的。我强烈建议您查看。