考虑以下简化示例:
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
问题 1: 是否有惯用的 Go 方法来检查是否e指向 nil 指针?
最好是内嵌片段。基本上使示例情况e != nil下false均匀。
我考虑过的:
如果getInternalMessengerVariant()返回接口类型而不是具体指针,则不会出现此问题,但它需要重构并且可能仍未被发现并在运行时产生恐慌(如果 e != nil)。
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()
}
海绵宝宝撒
MMMHUHU
相关分类