You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:57:43