Go中如何检测接口是否指向nil指针?(附示例)
Go语言中如何正确判断接口是否指向nil指针?
请看以下简化示例:
package main import ( "fmt" ) type IMessenger interface { Message() } type TMyMessenger struct { } func (m TMyMessenger) Message() {} func MessengerFactory() IMessenger { return getInternalMessengerVariant() } func getInternalMessengerVariant() *TMyMessenger { return nil } func main() { e := MessengerFactory() fmt.Println(" e == nil", e == nil) // *TMyMessenger(nil) if e != nil { e.Message() } }
运行输出:
e == nil false panic: runtime error: invalid memory address or nil pointer dereference
问题
有没有Go语言的惯用写法来检查e是否指向nil指针?最好是内联代码片段,目标是让示例中的e != nil判断结果为false。
已考虑的方案
如果
getInternalMessengerVariant()返回接口类型而非具体指针类型,就不会出现此问题,但这需要重构代码,且仍可能在运行时因e != nil判断失误导致panic。func getInternalMessengerVariant() IMessenger { return nil }重写
MessengerFactory()来拦截内部返回值:func MessengerFactory() IMessenger { if m := getInternalMessengerVariant(); m != nil { return m } return nil }进行特定类型检查,但如果存在多种类型该怎么办:
if e != nil && e != (*TMyMessenger)(nil) { e.Message() }
内容的提问来源于stack exchange,提问作者Paperclip
相关产品推荐
相关产品推荐

