2 回答

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

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