在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未执行。
有人可以向我解释一下吗?
答案 0 :(得分:1)
大概在case reflect.Struct
之上的某处,reflect.ValueOf(...).Kind()
如果您查看反映包中的Kind
,docs here
Struct
是其中一种,Ptr
是另一种。在switch语句中,它不匹配,因为*SomeStruct
方法的接收方中定义的IsZero()
类型为Ptr
而不是Struct
。
您需要v.Elem().Interface().(Zeroer)
来获取基础元素