繁体   English   中英

go - 如何检测golang中的结构指针是否为零?

[英]How to detect whether a struct pointer is nil in golang?

如以下代码所示: n := localplugin.NewPluginNet()n的类型是localnet.Net ,它是结构指针*localnet.DomainSocket实现的接口。 函数func NewPluginNet() localnet.Net返回一个指向n的 nil 指针。

var n localnet.Net    
n = localplugin.NewPluginNet()
fmt.Println("----> ", n)
if n == nil {
    fmt.Println("n is nil")
}else{
    fmt.Println("n is not nil : ",  n)
}
fmt.Println(reflect.TypeOf(n), reflect.TypeOf(nil), n)

以下是上面代码的输出。

---->  <nil>
n is not nil :  <nil>
*localnet.DomainSocket <nil> <nil>

为什么 n 不是 nil ?

====================================

var n1 *localnet.DomainSocket
n1 = nil
fmt.Println(">> ", n1)
if n1 == nil {
    fmt.Println(">>n1 is nil")
}else{
    fmt.Println(">>n1 is not nil : ",  n)
}
fmt.Println(reflect.TypeOf(n1), reflect.TypeOf(nil), n1)

但是,对于这种情况是正确的:

>>  <nil>
>>n1 is nil
*localnet.DomainSocket <nil> <nil>

为什么不是n nil n的类型是接口类型 ( localnet.Net ),它是(type; value)对的包装器。 即使它包装了一个nil值,该接口值也可能是非nil 请参阅隐藏 nil 值,了解 golang 为何会失败

要回答标题中的问题:您可以使用反射来判断非nil接口值是否包含nil值(例如nil指针):

reflect.ValueOf(someValue).IsNil()

例子:

type reader struct{}

func (*reader) Read(p []byte) (int, error) { return 0, nil }

func main() {
    var r io.Reader = (*reader)(nil)

    fmt.Println(r, r == nil)
    fmt.Println(reflect.ValueOf(r).IsNil())
}

输出(在Go Playground上试试):

<nil> false
true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM