反射值接口和指针接收器

2024-03-29

在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()

如果你看一下Kinds 在反射包中,文档在这里 https://golang.org/pkg/reflect/#Kind

Struct是其中一种并且Ptr是另一个。在 switch 语句中它不匹配,因为种类*SomeStruct正如接收者中所定义的IsZero()方法是Ptr并不是Struct.

你需要做v.Elem().Interface().(Zeroer)获取底层元素

可运行的例子在这里https://play.golang.org/p/tx1zgD7Ri0E https://play.golang.org/p/tx1zgD7Ri0E

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反射值接口和指针接收器 的相关文章

随机推荐

  • 如何在hibernate注释类中使两列作为主键

    这是我的注释类 我想要userId and groupId列都作为主键 我发现了更多问题 Question https stackoverflow com q 10422680 3156758 关于这个 但没有找到相关答案 我的声誉较差 所
  • 在构建路径中出现 JRE 系统库未绑定错误

    在构建路径中出现 JRE 系统库未绑定错误 尝试了以下链接中的所有建议 但不起作用 我有jdk 1 6 0 29 我也尝试安装其他版本但没有帮助 JRE 系统库 WebSphere v6 1 JRE 未绑定 https stackoverf
  • Rails 中的 example.com/controller 和 example.com/controller/ 有什么区别?

    我有一个 PostsController 对于示例来说不是必需的 但在粘贴片段时会有所帮助 并且我正在使用current page 顾名思义 找出正在显示的页面 我得到了看起来很奇怪的结果 current page 如果我去的话会返回不同的
  • 如何在 Python 2.7 中实现 GMRES 的 ILU 预处理器?

    我正在尝试比较带 ILU 预处理器和不带 ILU 预处理器的 GMRES 求解器 当未应用预处理器时 它会运行并提供正确的答案 x 1 1 1 但是 我似乎无法找到正确应用预处理器的方法 如何让这段代码与 ILU 预处理器一起运行 impo
  • 具有大量动态子域的站点的站点地图

    我正在运行一个允许用户创建子域的网站 我想通过站点地图将这些用户子域提交给搜索引擎 但是 根据站点地图协议 和 Google 网站管理员工具 单个站点地图只能包含来自单个主机的 URL 最好的方法是什么 目前我有以下结构 站点地图索引位于
  • 递归展开树

    我正在尝试实现一个自下而上的递归展开树 我递归到需要展开的节点 并找到该节点的父节点和祖父节点 然后我就可以根据情况选择之字形或之字形 问题是完成此操作后 我将已展开一次的节点返回到先前的递归调用 先前的递归调用引用了该节点的父节点 该节点
  • ListView 行样式 - 左对齐文本和右对齐图标

    我试图让 ListView 行如下所示 Text Text Text
  • MongoDB 数据库,相当于 SELECT column1, column2 FROM tbl

    从我的 MongoDB 中我想要相当于 SELECT column1 column2 FROM tbl 通过这段代码 我得到了所有的 行 也得到了所有的 列 DBCollection collection database getColle
  • Winforms C# Outlook 风格日历

    我的任务是在 winforms C 应用程序中重新创建 MS Access 日历 我为用户创造的东西 他们讨厌 基本上 我正在将数据转储到 DataGridView 中 他们可以按月 日或员工进行搜索以获取日历事件 他们要求重新设计 使其看
  • Alamofire 具有用于快速应用程序的自定义参数编码

    我必须在我的 swift 应用程序中从 SOAP Web 服务调用一些方法 所以我认为我应该使用自定义参数编码 但是当我为此编码创建闭包时 它似乎永远不会被调用 难道我做错了什么 这是我的代码 let custom URLRequestCo
  • Spring 4,JPA,关闭控制台调试消息

    我有一个基本的 Spring 4 JPA 应用程序 我使用所有 Java 配置 根本没有 XML 我想关闭控制台调试消息 我看到了很多关于此的问题并尝试了解决方案 但我仍然看到了所有消息 控制台消息如下所示 14 58 29 301 mai
  • 从函数返回数据 (Swift)

    我正在尝试返回结果并能够从此函数访问结果数组 函数中的一切都正常工作 但是我无法返回任何内容或访问结果或从闭包外部在函数内部创建的任何变量 我想从闭包外部访问 result valueForKey id 我怎样才能做到这一点 class V
  • 错误(Xcode):意外的重复任务:目标“Runner”已将命令从“path/GoogleService-Info.plist”复制到“path/GoogleService-Info.plist”

    我尝试在正确使用 firebase 进行设置后在 iOS 上运行 flutter 项目 但收到以下与 GoogleService Info plist 相关的重复错误 这是完整的错误输出 Error output from Xcode bu
  • Angular 订阅将对象推送到数组

    我正在制作角度应用程序 并且我有一个空数组 例如 users any 然后我拨打服务电话ngOnInit将数据存储到users像数组一样 ngOnInit Getting the data from json this httpClient
  • 将 SSRS 从 2016 年降级至 2008 年

    我们有 2 个工作环境 一个用于 SSRS 2016 另一个用于 2008 我错误地在 VS2016 中打开了一份 2008 年的报告 现在我无法打开2008年的它 如何将 2016 年打开的 SSRS 报告降级回 2008 年 我设法做到
  • 在 C++ API 中将一个张量的一大块复制到另一个张量中

    我需要复制一行一个张量 在c API 转换为另一个张量的某些部分 其中开始和结束索引可用 在 C 中我们可以使用类似的东西 int myints 10 20 30 40 50 60 70 std vector
  • 自定义 Perforce RCS 关键字扩展的输出

    我想使用 RCS 关键字扩展来过滤文件 以便 Change 被翻译成1745而不是默认行为 Change 1745 我意识到这会阻止未来的扩展 但就目的而言这是可以接受的 也欢迎使用其他将更改列表编号插入文件的方法 这是我在 Perforc
  • 列表视图多重选择

    有没有办法强制列表视图控件将所有点击视为通过 Control 键完成的 我需要复制使用控制键的功能 选择项目集并取消设置其选择状态 以便允许用户轻松地同时选择多个项目 先感谢您 即使 MultiSelect 设置为 true 这也不是 Li
  • 逐字迭代字符串

    我想知道如何逐字迭代字符串 string this is a string for word in string print word 上面给出了一个输出 t h i s i s a s t r i n g 但我正在寻找以下输出 this
  • 反射值接口和指针接收器

    在golang的mongodb驱动中有以下代码 case reflect Struct if z ok v Interface Zeroer ok return z IsZero return false Zeroer 接口定义如下 typ