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

标签 go

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

谁能解释一下原因(从接口(interface)表的角度)

(摘自 William Kennedy 的博客)

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

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

规范中的片段

方法集

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

类型的方法集决定了该类型实现的接口(interface)以及可以使用该类型的接收者调用的方法。

最佳答案

  1. 如果您有一个*T,您可以调用接收者类型为*T 的方法以及接收者类型为T< 的方法(您引用的段落,Method Sets)。
  2. 如果你有一个T,它是addressable您可以调用接收者类型为 *T 的方法以及接收者类型为 T 的方法,因为方法调用 t.Meth() 将等同于 (&t).Meth() ( Calls )。
  3. 如果你有一个 T 并且它是不可寻址的(例如,函数调用的结果,或者索引到 map 的结果),Go 无法获得指向它,因此您只能调用接收者类型为 T 的方法,而不是 *T
  4. 如果你有一个接口(interface)I,并且I的方法集中的部分或全部方法是由接收者为*T的方法提供的(其余部分由接收者为 T 的方法提供),则 *T 满足接口(interface) I,但是 T 没有。那是因为*T的方法集包括了T的方法集,但反过来不包括(再次回到第一点)。

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

关于go - 方法集(指针与值接收器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33587227/

相关文章:

go - 如何去 :generate stringer constants from multiple packages?

go - 在 Go 中 defer 关键字是如何工作的

Go 中 url 的 JSON 解码

go - 将返回值转换为特定类型

go - 查询进程状态

json - 使用 Go 解码 gZip json

golang 格式前导零带符号

docker - 在 Docker 中设置 Go Glide

build - Go——没有可构建的 Go 源文件

go - 为什么不关闭 channel 就不会出现死锁呢?