2 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
您正在聲明但未明確定義t
在兩種情況下都命名的變量。如果不指定值,則分配變量類(lèi)型的零值
所有指針類(lèi)型的零值,包括*T
nil。結(jié)構(gòu)類(lèi)型的零值是該結(jié)構(gòu)的所有字段都設(shè)置為零值的值。
當(dāng)為變量 [...] 分配存儲(chǔ)并且未提供顯式初始化時(shí),變量或值將被賦予默認(rèn)值。此類(lèi)變量或值的每個(gè)元素都設(shè)置為其類(lèi)型的零值:布爾值為 false,數(shù)字類(lèi)型為 0,字符串為 "",指針、函數(shù)、接口、切片、通道和映射為 nil。此初始化是遞歸完成的,因此,例如,如果未指定值,則結(jié)構(gòu)數(shù)組的每個(gè)元素都將其字段清零。
https://golang.org/ref/spec#The_zero_value
因此,這會(huì)將 nil 存儲(chǔ)在接口值中i
:
var i interface{ M() }
var t *T
i = t
// i stores nil
這在接口值中存儲(chǔ)了一個(gè)結(jié)構(gòu)值i:
var i interface{ M() }
var t T
i = t
// i stores T{S:""}
所以在第一種情況下,(nil).M()被稱(chēng)為(恐慌),在第二種情況下(T{}).M()被稱(chēng)為。

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊
你沒(méi)有初始化 T。
這樣做:
var t *T = &T{"Hello World"}
- 2 回答
- 0 關(guān)注
- 127 瀏覽
添加回答
舉報(bào)