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只是一个指针,而不是一个接口。

的相关/可能重复。