英文:
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 (
"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)
}
the output like below:
*interface {} <nil>
*interface {} <nil>
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
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论