代码段如下:
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{}
与:=
不同,为什么?
答案 0 :(得分:12)
在幕后,接口实现为两个元素,一个类型和一个值。该值称为接口的动态值,是一个任意的具体值,类型是值的类型。对于int值3,接口值示意性地包含(int,3)。
仅当内部值和类型都未设置(nil,nil)时,接口值才为nil。特别是,nil接口将始终保持nil类型。如果我们在接口值中存储类型为* int的nil指针,则无论指针的值如何,内部类型都将是* int:(* int,nil)。因此,即使内部指针为零,这样的接口值也将是非零的。
a := (*interface{})(nil)
与var a *interface{} = nil
相同。
但var b interface{} = (*interface{})(nil)
,b
类型interface{}
,interface{}
仅nil
变量类型和值均为nil
,显然,*interface{}
类型不是nil
。