为什么可以将引用类型分配给不满足的接口[golang]

为什么可以将引用类型分配给不满足的接口[golang],go,Go,我发现值类型和引用类型之间的接口可满足性令人困惑。我仍然不知道它在golang是如何工作的。考虑一下这个程序: type Counter1 int type Counter2 int func (c Counter1) String() string { } func (c *Counter2) String() string { } func main() { var c1 Counter1 var c2 Counter2 var i1 fmt.Stringe

我发现值类型和引用类型之间的接口可满足性令人困惑。我仍然不知道它在golang是如何工作的。考虑一下这个程序:

type Counter1 int
type Counter2 int

func (c Counter1) String() string {

}

func (c *Counter2) String() string {

}

func main() {
    var c1 Counter1
    var c2 Counter2
    var i1 fmt.Stringer = &c1 // assignment 1
    var i2 fmt.Stringer = c2 // assignment 2
}
然而,作业1有效,但作业2无效。我希望它们都不起作用:类型Counter1满足fmt.Stringer,而类型*Counter1不满足。So&c1不应分配给i1;类型Counter2不满足fmt。Stringer但是类型*Counter2满足,所以c2不应该分配给i2,实际上它不能。这个测试项目的结果对我来说毫无意义。我认为这可能是某种语法糖,go编译器会自动在引用类型和值类型之间进行转换。然而,下面的测试代码让我更加困惑:

type Test interface {
    f()
    g()
}

func (c Counter1) f() {
}

func (c *Counter1) g() {
}

func receiveTest(t Test) {
}

func main() {
    ......
    var c3 Counter1
    var p3 Test = &c3 // works
    receiveTest(&c3) // works
    receiveTest(c3) // doesn't work
}
类型*Counter1和类型Counter1均不满足接口测试。然而,第一个和第二个任务仍然有效。这对我来说毫无意义

在Go中,选择器表达式(
x.f
)表示值
x
(或有时
*x
)的字段或方法
f

基本上,在Go中,如果方法上有指针接收器,则不必编写
&object.method()
,只需编写
object.method()

因为接口在Go中是隐式的,只要对象本身不是指针,那么满足接口的方法是否有指针接收器并不重要,它们仍然会被用来满足它

因此,在您的示例中,
Counter1
结构可以同时调用
f()
g()
方法,但是
*Counter1
只能调用
g()
方法