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
    ——指针、切片、映射、通道或函数)。请注意,不同类型的'
    nil
    s是不同且不相关的(指针-
    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
(或type
MyError
)上定义了
error
方法。如果在类型
*MyError
上定义了
Error
方法,则在对基础类型
*MyError
的值调用
.Error()
时将调用该方法,无论基础值是否为
nil
*main.MyError
<*main.MyError Value>