我的困惑顯示在以下代碼片段中: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 關注
- 97 瀏覽
添加回答
舉報
0/150
提交
取消