gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:22:22 25 4
gpt4 key购买 nike

我很难理解为什么这些规则与指针类型 .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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com