在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 不会被执行。
谁可以给我解释一下这个?
大概在上面的某个地方case reflect.Struct
有一个开关打开reflect.ValueOf(...).Kind()
如果你看一下Kind
s 在反射包中,文档在这里 https://golang.org/pkg/reflect/#Kind
Struct
是其中一种并且Ptr
是另一个。在 switch 语句中它不匹配,因为种类*SomeStruct
正如接收者中所定义的IsZero()
方法是Ptr
并不是Struct
.
你需要做v.Elem().Interface().(Zeroer)
获取底层元素
可运行的例子在这里https://play.golang.org/p/tx1zgD7Ri0E https://play.golang.org/p/tx1zgD7Ri0E
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)