在用于golang的mongodb驱动程序中,包含以下代码:
case reflect.Struct: if z, ok := v.Interface().(Zeroer); ok { return z.IsZero() } return false
接口清零器的定义如下:
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()
case reflect.Struct
reflect.ValueOf(...).Kind()
如果您Kind在Reflection包中查看,则此处的文档
Kind
Struct是其中一种,又Ptr是另一种。在switch语句中,它不匹配,因为*SomeStruct该IsZero()方法的接收者中定义的种类是Ptrand not Struct。
Struct
Ptr
*SomeStruct
IsZero()
您需要做得到v.Elem().Interface().(Zeroer)底层元素
v.Elem().Interface().(Zeroer)
这里的可运行示例https://play.golang.org/p/tx1zgD7Ri0E