当前位置: 首页 > 面试题库 >

反映值接口和指针接收器

梁新觉
2023-03-14
问题内容

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

如果您Kind在Reflection包中查看,则此处的文档

Struct是其中一种,又Ptr是另一种。在switch语句中,它不匹配,因为*SomeStructIsZero()方法的接收者中定义的种类是Ptrand
not Struct

您需要做得到v.Elem().Interface().(Zeroer)底层元素

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



 类似资料:
  • 问题内容: 对于我来说,目前尚不清楚,在这种情况下,我想使用值接收器而不是始终使用指针接收器。 回顾一下文档: 该 文档 还说:“对于基本类型,切片和小型结构之类的类型,值接收器非常便宜,因此,除非该方法的语义要求使用指针,否则值接收器是高效且清晰的。” 首先, 它说“非常便宜”,但问题是它比指针接收器便宜。因此,我做了一个小的基准测试(基于要点的代码),向我展示了,即使对于只有一个字符串字段的结

  • 问题内容: 我一直在从关于指针接收器的话题中出错,我决定用谷歌搜索术语的含义,并且阅读了有关指针接收器的不同资源和文档。例如:http : //golang.org/doc/faq和http://jordanorelli.com/post/32665860244/how- to-use-interfaces-in-go。 虽然,尽管他们谈论这些术语,但仍未能准确定义它们。不过,从上下文来看,我认为

  • 问题内容: 我很难理解为什么这些规则与指针类型.vs的方法集相关联。值类型 有人可以解释一下原因吗(从界面表的角度) (威廉·肯尼迪博客的摘录) 规格摘要 方法集 类型可能具有与之关联的方法集。接口类型的方法集是其接口。任何其他类型T的方法集都包含以接收者类型T声明的所有方法。相应指针类型 T的方法集是所有以接收者 T或T声明的方法的集合(也就是说,它还包含方法T集)。进一步的规则适用于包含匿名字

  • 问题内容: 是否可以更改接口定义的指针类型和变量值? 我可以使用反射更改指针值:等效于。 但是我怎样才能使反射等效呢? 更新:不幸的是,在我要解决的实际问题中,我无法解决原始变量(),这就是为什么我要尝试在指针级别进行变通。 这是完整的示例代码: 问题答案: Go中的所有内容都是通过价值传递的。接口也。当您传递接口类型的值时,将创建接口值的副本(及其内部),并且您将只能修改该副本,而不会影响原始副

  • 问题内容: 我最近正在研究虹膜框架。在实现处理程序时遇到一个问题。如下所示: 为了使用此控制器,我实现了以下输入脚本: 但是,当我编译代码时,收到以下错误消息: 在我将声明更改为: 然后,编译器通过,没有任何抱怨。 问题是:我认为以下语句是相等的,因为GO编译器将在表下进行转换: 为什么我不能用作为参数,而不是作为参数传递给? 感谢您的宝贵时间和分享。 问题答案: 参阅文件: 类型可能具有与之关联

  • 问题内容: 我认为,一旦它被召唤出来,这将变得有点明显,但现在以下内容并未点击。 我有一个叫做Stack的类型,它是空接口的一部分。假定为空,则Push方法满足该接口。给定切片是引用类型,为什么不能仅按​​值传递“堆栈”接收器?此外,在上面的示例中,接收器作为指针传递,为什么附加的内置内置元素需要再次通过指针传递? IE,鉴于分片是指向基础数组的引用指针,为什么不起作用? 问题答案: 请参阅Go博