[英]How to make a variable with this data type and value in Golang? Pointer to a struct with a nil value?
[英]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.