gpt4 book ai didi

go - 反射值接口(interface)和指针接收器

转载 作者:IT王子 更新时间:2023-10-29 01:44:20 25 4
gpt4 key购买 nike

在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 没有被执行。

有人能给我解释一下吗?

最佳答案

大概在 case reflect.Struct 上方的某处有一个开关 reflect.ValueOf(...).Kind()

如果您查看反射包中的 Kinddocs here

Struct 是其中一种,Ptr 是另一种。在 switch 语句中它不匹配,因为在 IsZero() 方法的接收器中定义的种类 *SomeStructPtr 而不是 结构

您需要执行 v.Elem().Interface().(Zeroer) 来获取底层元素

此处可运行示例 https://play.golang.org/p/tx1zgD7Ri0E

关于go - 反射值接口(interface)和指针接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50163955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com