go - x := [. ..] 字符串 {"Sat", "Sun"} vs x := []string {"Sat", "Sun"}

标签 go variadic-templates

在 go 语言中 spec他们在其中一个示例中使用了三个点:

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

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

最佳答案

差别很大:差别在于 arrayslice

[]string 创建一个指向字符串数组的 slice 。另一方面,[...] 创建一个 actual 字符串数组。

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

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

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

// 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

还要注意,数组和结构一样,是作为值传递的——数组的副本将被提供给函数,而不是对它的引用..

另一方面, slice 类似于引用类型。它们由数组支持,但更具延展性。它们包括指向数组中某个位置的指针、长度和容量。

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

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

还有一篇关于 Go Data Structures 的精彩帖子,以及它们在内存中的表示方式。我强烈建议检查一下。

关于go - x := [. ..] 字符串 {"Sat", "Sun"} vs x := []string {"Sat", "Sun"},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20254834/

相关文章:

C++ 可变参数模板移除函数逻辑

audio - 使 go http 客户端与非标准的 http 服务器一起工作

arrays - slice 数组 - GO

go - 在 Golang 和 Rust 上使用 Messagepack 编码时的输出不同

go - 关闭终端中的回显 - Golang

C++ 可变参数模板 : can't match function

c++ - "candidate template ignored: could not match ..."用于模板函数的模板函数参数

c++ - 如何比较参数包中的类型(包括引用限定符)和 std::function 参数的类型

mongodb - 为什么我的查询没有更新数组中的对象?

c++ - 打包可变参数模板具有零元素时的递归