小编典典

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

go

我很难理解为什么这些规则与指针类型.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集)。进一步的规则适用于包含匿名字段的结构,如有关结构类型的部分中所述。其他任何类型的方法集都为空。在方法集中,每个方法必须具有唯一的非空白方法名称。

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


阅读 329

收藏
2020-07-02

共1个答案

小编典典

  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,但不是(反过来又回到第一点)。

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

2020-07-02