Interface Go接口为(类型,无)或(类型,值)
嗨,我想问一个关于接口为零的问题Interface Go接口为(类型,无)或(类型,值),interface,go,Interface,Go,嗨,我想问一个关于接口为零的问题 //i think err should be a interface (*MyError, nil) var err error = (*MyError)(nil) fmt.Println(reflect.TypeOf(err)) fmt.Println(reflect.ValueOf(err))` 结果告诉我接口值不是零 结果: *main.MyError 它相当于接口(*main.MyError,) 为什么接口值不是零 谢谢 ValueOf返回初始
//i think err should be a interface (*MyError, nil)
var err error = (*MyError)(nil)
fmt.Println(reflect.TypeOf(err))
fmt.Println(reflect.ValueOf(err))`
结果告诉我接口值不是零
结果:
*main.MyError
它相当于接口(*main.MyError,)
为什么接口值不是零
谢谢
ValueOf返回初始化为存储的具体值的新值
在界面i中ValueOf(nil)返回零值。
这两件事完全不同:
接口值。它不包含基础类型或值nil
- 一种非
接口值,它保存一个底层类型和值,并且该底层值是该底层类型中的nil
(如果它是一种类型,其值称为nil
——指针、切片、映射、通道或函数)。请注意,不同类型的'nil
s是不同且不相关的(指针-nil
和映射-nil
是不相关的);有些类型没有名为nil
的值nil
nil
指针(*MyError
type),并将其分配给一个接口变量(首先是接口类型error
,然后转换为接口类型interface{}
,它是reflect.TypeOf()
和reflect.ValueOf()
的参数类型。因此,这些函数接收一个非nil
接口值,其中包含底层类型*MyError
和底层值nil
reflect.TypeOf(err)
获取底层类型,即*MyError
。和reflect.ValueOf(err)
构造一个reflect.Value
对象,表示底层类型和值。这就是你看到的
生成字符串
,其中T
是类型,但它不尝试严格指定值(nil
在本例中为指针)。如果您想打印基础值,也许您应该只做fmt.Println(err)
。我知道reflect.ValueOf(err)的结果是。为什么err(interface)可以调用Error()方法?@BrainWu:变量err
属于Error
类型,该接口包含方法Error()
。因此,无论底层类型是什么,您都可以对其调用Error()
。*MyError
符合接口error
这一事实意味着在type*MyError
(或typeMyError
)上定义了error
方法。如果在类型*MyError
上定义了Error
方法,则在对基础类型*MyError
的值调用.Error()
时将调用该方法,无论基础值是否为nil
。
*main.MyError
<*main.MyError Value>