代码片段如下:
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{}
和:=
是不同的,为什么呢?
发布于 2017-03-28 10:43:18
根据golang faq的说法
在幕后,接口被实现为两个元素,一个类型和一个值。该值称为接口的动态值,是一个任意的具体值,类型是该值的类型。对于int值3,接口值示意性地包含( int,3)。
仅当内部值和类型都未设置时,接口值才为nil (nil,nil)。具体地说,nil接口将始终保持nil类型。如果我们在接口值中存储一个*int类型的nil指针,那么内部类型将是*int,而不管指针的值是什么:(*int,nil)。因此,即使内部指针为nil,这样的接口值也将为非nil。
a := (*interface{})(nil)
等同于var a *interface{} = nil
。
但是var b interface{} = (*interface{})(nil)
,mean b
的类型是interface{}
,当它的类型和值都是nil
时,interface{}
只会变nil
,很明显,类型*interface{}
不是nil
。
https://stackoverflow.com/questions/43059653
复制相似问题