2 回答

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
每當(dāng)您從函數(shù)返回接口時(shí),都會(huì)存在此問題:如果接口包含類型化的 nil 指針,則接口本身不是 nil。沒有簡單的方法來檢查它。
處理這個(gè)問題的一個(gè)好方法是為接口返回一個(gè) nil:
func MessengerFactory() IMessenger {
x:= getInternalMessengerVariant()
if x==nil {
return nil
}
return x
}
那么你就不需要檢查返回值是否指向一個(gè) nil 指針。

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
Burak Serdar 在他的回答中很好地解釋了為什么要為您if x == nil返回false。
但這不是你感到恐慌的原因。
Go 很樂意在nil指針上調(diào)用接收器函數(shù),只要接收器不取消引用指針即可。
這不會(huì)恐慌:
type TMyMessenger struct {
}
func (m *TMyMessenger) Message() {}
func main() {
var t *TMyMessenger = nil
t.Message()
}
那是因?yàn)槟銢]有取消引用接收函數(shù)m中的指針。Message
你的例子只會(huì)恐慌,因?yàn)槟阋呀?jīng)m在類型TMyMessenger(而不是指針)上定義了接收函數(shù)。因此,Go 將不得不取消引用指向接口值內(nèi)部的nil指針,以便調(diào)用接收函數(shù)。TMyMessengerIMessenger
如果您更改代碼中的一行,它將不再恐慌:
func (m *TMyMessenger) Message() {}
((m TMyMessenger)改為(m *TMyMessenger))
- 2 回答
- 0 關(guān)注
- 167 瀏覽
添加回答
舉報(bào)