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

标签 pointers go interface null compare

如下代码所示:n := localplugin.NewPluginNet()n的类型为localnet.Net,这是一个由结构指针*localnet.DomainSocket实现的接口(interface)。函数 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 不是 niln 的类型是一种接口(interface)类型 (localnet.Net),它是 (type; value) 对的包装器。接口(interface)值可能是非 nil,即使它包装了一个 nil 值。参见 Hiding nil values, understanding why golang fails here

要回答标题中的问题:您可以使用反射来判断非 nil 接口(interface)值是否包装了 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

关于pointers - 如何检测golang中的结构指针是否为nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55900390/

相关文章:

c - 如何在c中返回指向数组的指针

java - 定义一个实现可比较的接口(interface)

c# - 创建接口(interface)时的差异

c++ - C++ 函数定义中的 "Type&"与 "Type*"

C语言将一个数组的元素范围复制到另一个数组

C++:通过指针访问结构的成员

mongodb - 如何检索具有匹配属性的对象数组的 mongo 文档

测试时Golang "plugin was built with a different version of package"

go - 如何返回我用 Gorm 的 Create() 创建的记录?

java - 发送一个 Object 类型的对象而不是 String - 多态性