首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x:= [.]字符串{“Sat”,"Sun"} vs x:=[]字符串{“Sat”,"Sun"}

x:= [.]字符串{“Sat”,"Sun"} vs x:=[]字符串{“Sat”,"Sun"}
EN

Stack Overflow用户
提问于 2013-11-27 23:05:33
回答 1查看 2.5K关注 0票数 14

在go lang 等级库中,他们在其中一个示例中使用了三个点:

代码语言:javascript
复制
days := [...]string{"Sat", "Sun"}  // len(days) == 2

如果省略这三个点,会有什么区别吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-27 23:07:15

这有很大的不同:区别在于arrayslice

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

有一个伟大的博客帖子关于两者之间的差异在黄金博客上。我会尽我所能在这里总结一下。

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

代码语言:javascript
复制
// 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" } 

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

代码语言:javascript
复制
// 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

还请注意,与结构一样,数组是作为值传递的--数组的副本将被赋予一个函数,而不是一个对它的引用。

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

代码语言:javascript
复制
// Create a slice
var days := []string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }

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

还有一篇关于Go数据结构的很好的文章,以及它们是如何在内存中表示的。我强烈建议你去看看。

票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20254834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档