在golang的mongodb驱动程序中,有以下代码:
case reflect.Struct:
if z, ok := v.Interface().(Zeroer); ok {
return z.IsZero()
}
return false
Interface Zeroer的定义如下:
type Zeroer interface {
IsZero() bool
}
当我实现我的结构
func (id SomeStruct) IsZero() bool {
return id.ID == ""
}
有用 . 但是当我使用指针接收器实现IsZero方法时:
func (id *SomeStruct) IsZero() bool {
return id.ID == ""
}
类型断言失败,IsZero未执行 .
谁可以给我解释一下这个?
1 回答
大概是在
case reflect.Struct
之上的某处,有一个开关reflect.ValueOf(...).Kind()
如果你看一下反射包中的
Kind
,docs hereStruct
是其中一种,Ptr
是另一种 . 在switch语句中它不匹配,因为IsZero()
方法的接收器中定义的类型*SomeStruct
是Ptr
而不是Struct
.你需要做
v.Elem().Interface().(Zeroer)
来获取底层元素这里可运行的例子https://play.golang.org/p/tx1zgD7Ri0E