【问题标题】:reflect value Interface and pointer receiver反射值接口和指针接收器
【发布时间】:2018-10-14 07:02:58
【问题描述】:

在golang的mongodb驱动中有如下代码:

case reflect.Struct:
    if z, ok := v.Interface().(Zeroer); ok {
        return z.IsZero()
    }
    return false

接口 Zeroer 定义如下:

type Zeroer interface {
    IsZero() bool
}

当我用

实现我的结构时
func (id SomeStruct) IsZero() bool {
    return id.ID == ""
}

它有效。但是当我使用指针接收器实现 IsZero 方法时:

func (id *SomeStruct) IsZero() bool {
        return id.ID == ""
 }

类型断言失败,IsZero 没有被执行。

谁能给我解释一下?

【问题讨论】:

  • 你没有显示失败的代码,但这意味着你没有传入一个指针,这是该接收器所需的类型。

标签: go interface


【解决方案1】:

大概在case reflect.Struct上方的某个地方有一个reflect.ValueOf(...).Kind()上的开关

如果你查看反射包中的Kinds,docs here

Struct 是其中一种,Ptr 是另一种。在 switch 语句中它不匹配,因为IsZero() 方法的接收者中定义的*SomeStruct 类型是Ptr 而不是Struct。

您需要执行 v.Elem().Interface().(Zeroer) 来获取底层元素

此处可运行示例https://play.golang.org/p/tx1zgD7Ri0E

【讨论】:

    猜你喜欢
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 2016-09-22
    相关资源
    最近更新 更多