Go v==nil如何返回false并同时反映.ValueOf(v).IsNil()返回true?
下面是一些代码:Go v==nil如何返回false并同时反映.ValueOf(v).IsNil()返回true?,go,Go,下面是一些代码: var v interface{} v = (*string)(nil) // Reflect says it is nil val := reflect.ValueOf(v) if val.IsNil() { fmt.Println("val is nil") } else { fmt.Println("val is not nil") } // This says it is not nil if v == nil
var v interface{}
v = (*string)(nil)
// Reflect says it is nil
val := reflect.ValueOf(v)
if val.IsNil() {
fmt.Println("val is nil")
} else {
fmt.Println("val is not nil")
}
// This says it is not nil
if v == nil {
fmt.Println("v is nil")
} else {
fmt.Println("v is not nil")
}
输出为:
瓦尔是零
v不是零
这怎么可能?是不是零
另外,如果使用
v := (*string)(nil)
然后输出清楚地表明变量为零
现在在我的项目中,我有一个函数,它接受接口{}类型的参数,我不能用简单的v==nil可靠地检查它是否为nil。我希望避免使用reflect软件包。:
在封面下,接口被实现为两个元素,一个类型
和一个值。该值称为接口的动态值,是一个
任意具体值,类型为该值的类型。对于
int值3,接口值示意性地包含int,3
仅当内部值和类型都为时,接口值才为nil
没有,没有,没有。特别是,nil接口将始终保持
零型。如果我们在接口中存储*int类型的nil指针
值时,内部类型将为*int,而不管
指针:*int,nil。因此,这样的接口值将是
非nil,即使内部指针为nil
您可以尝试fmt.Printf%v,%T\n,v,v。它打印,*字符串
将前两行更改为v:=*stringnil时,v只是一个指针,而不是一个接口。的相关/可能重复。