首页 > 解决方案 > 反射值接口和指针接收器

问题描述

在 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 没有被执行。

谁可以给我解释一下这个?

标签: gointerface

解决方案


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

如果您查看Kind反射包中的 s,请参阅此处的文档

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

你需要做v.Elem().Interface().(Zeroer)才能获得底层元素

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


推荐阅读