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 关注
- 188 浏览
添加回答
举报