为了账号安全,请及时绑定邮箱和手机立即绑定

转到:关于结构数组初始化的困惑

转到:关于结构数组初始化的困惑

Go
噜噜哒 2022-09-26 15:30:16
我的困惑显示在以下代码片段中:type Ex struct{    A,B int}a := []Ex{Ex{1, 2}, Ex{3, 4}}     //it works, and I understand itb := []*Ex{&Ex{1, 2}, &Ex{3, 4}}   //it works, and I understand itc := []Ex{{1, 2}, {3, 4}}   //it works, and I don't understand itd := []*Ex{{1, 2}, {3, 4}}   //it works, and I don't understand ite := []*Ex{{1, 2}, &Ex{3, 4}}   //it works, and I don't understand it最让我困惑的是,两者都可以很好地工作。为什么可以同时用于初始化对象和指针?c := []Ex{{1, 2}, {3, 4}}d := []*Ex{{1, 2}, {3, 4}}{1, 2}我发现了同样的问题,有人回答了:如果 是像 *Ex 或 *Track 这样的指针,它也会自动正确初始化:但我期待一个更深层次的解释。是否有关于这个问题的官方文件?我有一个很好的C/C++基础,但是一个Golang新手。期待您的回答,我提前感谢您。
查看完整描述

1 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

规范:复合文字:

在数组、切片或映射类型的复合文本中,本身就是复合文本的元素或映射键的元素或映射键可以与 的元素或键类型相同,则可能会省略相应的文本类型。同样,当元素或键类型为 时,作为复合文本地址的元素或键可能会省略 。TT&T*T

这解释了案例,以及 。cde

c := []Ex{{1, 2}, {3, 4}}
d := []*Ex{{1, 2}, {3, 4}}
e := []*Ex{{1, 2}, &Ex{3, 4}}

所有这些都是切片复合文本,并且元素也使用复合文本提供。因此,引用的部分适用。根据规范,您可以从元素的复合文本中省略 元素类型(如果它是指针类型,也可以省略运算符),在这种情况下,它是从切片的元素类型(“外部”复合文本)推断出来的。T&

如果为 ,则被解释为复合文字。c{1, 2}Ex{1, 2}

在 的情况下,被解释为 ,即取复合文字的地址。d{1, 2}&Ex{1, 2}Ex{1, 2}

这同样适用于大小写(因为切片的元素类型是相同的)。e

这是对语言规范允许的复合文字的简化。当从切片类型中知道所有元素类型时,对所有元素重复元素类型是多余的,会使代码更长且更难阅读。


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 75 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信