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

huangapple go评论82阅读模式
英文:

golang (*interface{})(nil) is nil or not?

问题

代码片段如下:

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{}:=是不同的,为什么呢?

英文:

the code snippet is the following:

package main

import (
    &quot;fmt&quot;
    &quot;reflect&quot;
)

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)
}

the output like below:

*interface {} &lt;nil&gt;
*interface {} &lt;nil&gt;
true false

so var interface{} is different from :=,why?

答案1

得分: 23

根据golang faq的解释:

接口在底层是由两个元素实现的,一个是类型(type),一个是值(value)。值被称为接口的动态值(dynamic value),它是一个任意的具体值,而类型则是该值的类型。对于整数值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),意味着 b 的类型是 interface{},而 interface{} 类型的变量只有在其类型和值都为 nil 时才为 nil,显然 *interface{} 类型不是 nil

英文:

according to golang faq
> Under the covers, interfaces are implemented as two elements, a type and a value. The value, called the interface's dynamic value, is an arbitrary concrete value and the type is that of the value. For the int value 3, an interface value contains, schematically, (int, 3).
>
> An interface value is nil only if the inner value and type are both unset, (nil, nil). In particular, a nil interface will always hold a nil type. If we store a nil pointer of type *int inside an interface value, the inner type will be *int regardless of the value of the pointer: (*int, nil). Such an interface value will therefore be non-nil even when the pointer inside is nil.

a := (*interface{})(nil) is equal with var a *interface{} = nil.

but var b interface{} = (*interface{})(nil) , mean b is type interface{}, and interface{} variable only nil when it's type and value are both nil, obviously type *interface{} is not nil.

huangapple
  • 本文由 发表于 2017年3月28日 10:28:39
  • 转载请务必保留本文链接:https://go.coder-hub.com/43059653.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定