Golang中的(*interface{})(nil)是nil吗?

12

代码片段如下:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    a := (*interface{})(nil)
    fmt.Println(reflect.TypeOf(a), reflect.ValueOf(a))
    var b interface{} = (*interface{})(nil)
    fmt.Println(reflect.TypeOf(b), reflect.ValueOf(b))
    fmt.Println(a == nil, b == nil)
}

输出如下:

*interface {} <nil>
*interface {} <nil>
true false

那么var interface{}:=有什么不同呢?

1个回答

23
根据golang faq,接口在底层实现时由两个元素组成:类型和值。该值称为接口的动态值,是任意具体值,类型为该值的类型。例如,对于int值3,接口值包含(int,3)。
只有当内部值和类型都未设置时,接口值才为nil,即(nil,nil)。特别地,nil接口始终保持nil类型。如果我们将类型为*int的nil指针存储在接口值中,则无论指针的值如何,内部类型都将为*int:(*int,nil)。因此,即使内部指针为空,这样的接口值也将是非nil的。 a :=(* interface {})(nil)等同于var a * interface {} = nil
但是 var b interface{} = (*interface{})(nil) 的意思是,b 是类型为 interface{} 的变量,并且只有在它的类型和值都是 nil 时,interface{} 变量才是 nil,显然,类型为 *interface{} 的变量不是 nil

很好的答案,我不知道这个。不过我必须说,我很难理解你的解释... 你可以引用链接中的前两段,这将为你的答案增加价值! - alexbt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接