如下代码所示: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
不是 nil
? n
的类型是一种接口(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/