go - 反射值接口和指针接收器
问题描述
在 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,请参阅此处的文档
Struct
是其中一种,Ptr
是另一种。在 switch 语句中它不匹配,因为在方法*SomeStruct
的接收者中定义的种类IsZero()
isPtr
和 not Struct
。
你需要做v.Elem().Interface().(Zeroer)
才能获得底层元素
推荐阅读
- python - 如何使用 for 循环向 dict 添加额外属性
- javascript - 请求 HTML JavaScript 隐藏输入
- r - 修改对象以在 R 中与 summary_table() 一起使用:“错误:`x` 必须是公式”
- python - 基于另一个线程激活一个线程
- r - 将整个文本放入绘图区域
- c++ - 为什么我的第二个 sendinput 实际上没有发送输入?
- javascript - Jquery İnput Keyup 泰语、英语和空间字符
- mysql - Elasticsearch 会更好地与像 MongoDB 这样的文档数据库或像 MySQL 这样的关系数据库一起工作吗?
- python - 如何使用 autouse 全局定义补丁?
- javascript - 在firebase中选择内部循环?