Pointers 如何在golang中检测结构指针是否为nil?

Pointers 如何在golang中检测结构指针是否为nil?,pointers,go,interface,null,compare,Pointers,Go,Interface,Null,Compare,如以下代码所示:n:=localplugin.NewPluginNet(),n的类型是localnet.Net,它是由结构指针*localnet.DomainSocket实现的接口。函数func NewPluginNet()localnet.Net返回指向n的零指针 var n localnet.Net n = localplugin.NewPluginNet() fmt.Println("----> ", n) if n == nil { fmt.Println("n i

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

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>
但是,对于这种情况,这是正确的:

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

为什么
n
nil
n
的类型是接口类型(
localnet.Net
),它是
(Type;value)
对的包装。接口值可能是非
nil
,即使它包装了
nil
值。看

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

例如:

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())
}
输出(在上尝试):

false
真的
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())
}
<nil> false
true