我的困惑显示在以下代码片段中: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个赞
在数组、切片或映射类型的复合文本中,本身就是复合文本的元素或映射键的元素或映射键可以与 的元素或键类型相同,则可能会省略相应的文本类型。同样,当元素或键类型为 时,作为复合文本地址的元素或键可能会省略 。
T
T
&T
*T
这解释了案例,以及 。c
d
e
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
这是对语言规范允许的复合文字的简化。当从切片类型中知道所有元素类型时,对所有元素重复元素类型是多余的,会使代码更长且更难阅读。
- 1 回答
- 0 关注
- 75 浏览
添加回答
举报
0/150
提交
取消