我很难理解为什么这些规则与指针类型 .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)以及可以使用该类型的接收者调用的方法。
最佳答案
- 如果您有一个
*T
,您可以调用接收者类型为*T
的方法以及接收者类型为T< 的方法
(您引用的段落,Method Sets)。 - 如果你有一个
T
,它是addressable您可以调用接收者类型为*T
的方法以及接收者类型为T
的方法,因为方法调用t.Meth()
将等同于(&t).Meth()
( Calls )。 - 如果你有一个
T
并且它是不可寻址的(例如,函数调用的结果,或者索引到 map 的结果),Go 无法获得指向它,因此您只能调用接收者类型为T
的方法,而不是*T
。 - 如果你有一个接口(interface)
I
,并且I
的方法集中的部分或全部方法是由接收者为*T的方法提供的
(其余部分由接收者为T
的方法提供),则*T
满足接口(interface)I
,但是T
没有。那是因为*T
的方法集包括了T
的方法集,但反过来不包括(再次回到第一点)。
简而言之,您可以将方法与值接收器和方法与指针接收器混合搭配,并将它们与包含值和指针的变量一起使用,而不必担心哪个是哪个。两者都可以,而且语法是一样的。但是,如果需要具有指针接收器的方法来满足接口(interface),则只能将指针分配给接口(interface)——值将无效。
关于go - 方法集(指针与值接收器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33587227/