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

方法集(指针与值接收器)

唐经国
2023-03-14
问题内容

我很难理解为什么这些规则与指针类型.vs的方法集相关联。值类型

有人可以解释一下原因吗(从界面表的角度)

(威廉·肯尼迪博客的摘录)

Values          Methods Receivers
-----------------------------------------------
T               (t T)
*T              (t T) and (t *T)

Methods Receivers    Values
-----------------------------------------------
(t T)                 T and *T
(t *T)                *T

规格摘要

方法集

类型可能具有与之关联的方法集。接口类型的方法集是其接口。任何其他类型T的方法集都包含以接收者类型T声明的所有方法。相应指针类型 T的方法集是所有以接收者
T或T声明的方法的集合(也就是说,它还包含方法T集)。进一步的规则适用于包含匿名字段的结构,如有关结构类型的部分中所述。其他任何类型的方法集都为空。在方法集中,每个方法必须具有唯一的非空白方法名称。

类型的方法集确定该类型实现的接口以及可以使用该类型的接收器调用的方法。


问题答案:
  1. 如果您有a *T,则可以调用具有接收器类型的*T方法以及具有接收器类型的方法T(您引用的段落, 方法集)。
  2. 如果具有a T并且它是可寻址的,则可以调用具有接收器类型的*T方法以及具有接收器类型T的方法,因为该方法调用t.Meth()将等效于(&t).Meth()(Calls)。
  3. 如果您有一个T且无法寻址,则只能调用接收者类型为T而不是的方法*T
  4. 如果您有一个接口I,并且I方法集中的某些或全部方法由接收者为的方法提供*T(其余部分由接收者为的方法提供T),则*T满足该接口I,但T不满足。那是因为*T的方法集包含T,但不是(反过来又回到第一点)。

简而言之,您可以将方法与值接收器混合使用,将方法与指针接收器混合使用,并将它们与包含值和指针的变量一起使用,而不必担心哪个是哪个。两者都可以使用,并且语法相同。但是,如果需要使用带有指针接收器的方法来满足一个接口,则只能将一个指针分配给该接口-
值将无效。



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

  • 当结构体实现一个接口时,可以在方法中设置一个接收者,比如对于以下接口: type Inter interface { foo() } 结构体在实现它时,方法的接收者类型可以是:值、指针。比如: type S struct {} func (s S) foo() {} // 值类型 func (s *S) foo() {} // 或者指针类型 在使用结构体初始化接口变量时,结构体的类型

  • 问题内容: 我有这个示例代码 无法正常工作,因为其接收器不是指针类型。 如果我将方法更改为指针接收器,那么我希望它可以正常工作,如下所示: 编译会导致以下错误: 如何在不创建副本的情况下使接口 和 方法实现实际实例的值? 这是一个可入侵的代码段:https : //play.golang.org/p/ghW0mk0IuU 问题答案: 您指向结构的指针应实现该接口。这样,您可以修改其字段。 查看我如

  • 问题内容: 在用于golang的mongodb驱动程序中,包含以下代码: 接口清零器的定义如下: 当我实现我的结构 有用。但是,当我使用指针接收器实现IsZero方法时: 类型声明失败,并且IsZero无法执行。 谁可以给我解释一下这个? 问题答案: 据推测某处之上的有上的开关 如果您在Reflection包中查看,则此处的文档 是其中一种,又是另一种。在switch语句中,它不匹配,因为该方法的

  • 问题内容: 已关闭 。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗? 添加详细信息并通过编辑此帖子来澄清问题。 3个月前关闭。 改善这个问题 关于“ X不能实现Y(…方法具有指针接收器) ”的事情已经有一些问答,但是对我来说,他们似乎在谈论不同的事情,而不适用于我的具体情况。 因此,我没有使问题变得非常具体,而是使之变得笼统和抽象-似乎有几种不同的情况可以使此错误发生,请有人总结一

  • 问题内容: 我只是在环游世界中练习51练习。解释声称,该方法在接收到a 而不是指向a的指针时无效。 然而,当我改变声明,以在输出唯一的变化是丢失的标记指针。 那么,即使变量不是指针,为什么还要更改它收到的变量呢? 问题答案: 它不会“接收”值。Go是强类型的,因此如果在某处指定了指向T的指针,则指向T()的指针是唯一可以作为该类型位置的值出现的选项。 “魔术”在编译器中,可以在某些条件下有效地“重