Go 戈朗法接收机

Go 戈朗法接收机,go,interface,Go,Interface,根据,golang将生成类型接收器方法和点接收器方法,这意味着以下代码将正常工作,并且值将意外更改 func (test *Test) modify() { test.a++ } func main() { test := Test{10} fmt.Println(test) test.modify() fmt.Println(test) } 我认为我可以接受。但当这和界面混合在一起时,事情就出了问题 type Modifiable interface

根据,golang将生成
类型接收器方法
点接收器方法
,这意味着以下代码将正常工作,并且值将意外更改

func (test *Test) modify() {
    test.a++
}

func main() {
    test := Test{10}
    fmt.Println(test)
    test.modify()
    fmt.Println(test)
}
我认为我可以接受。但当这和界面混合在一起时,事情就出了问题

type Modifiable interface {
    modify()
}

type Test struct {
    a int
}

func (test *Test) modify() {
    test.a++
}

func main() {
    test := Test{10}
    fmt.Println(test)
    test.modify()
    fmt.Println(test)

    var a Modifiable

    a = test
}
它说:

Test does not implement Modifiable (modify method has pointer receiver)
为什么会这样


以及golang实际如何处理方法调用?

如果您想使用具有指针接收器的方法。这意味着您必须传递地址值

以下是一个例子:

package main

import "fmt"

type Modifiable interface {
    modify()
}

type Test struct {
    a int
}

func (test *Test) modify() {
    test.a++
}

func main() {
    test := Test{10}
    fmt.Println(test)
    test.modify()
    fmt.Println(test)

    var a Modifiable

    a = &test
    a.modify()
    fmt.Println(a)
}
总之,每当您在方法中创建指针接收器时,接口将接受地址值。

当您说:

func (test *Test) modify() {
    test.a++
}
这意味着接口
可修改
由类型
*Test
即指向Test的指针实现

何处为

func (test Test) modify() {
        test.a++
}
表示接口是通过类型
测试实现的


结论是:类型和指向该类型的指针是两种不同的类型。

但是
test
变量确实有一个名为
modify
的方法,我可以通过
test.modify()调用,为什么它说
测试不实现可修改的
?因为您在
*测试
上实现了接口,而不是
测试
修改
方法是为
*测试
定义的,而不是为
测试
类型定义的。调用
test.modify
时,编译器将自动通过
*测试
,但从接口实现的角度来看,您需要显式使用
*测试
,因此给定链接中的答案是错误的,
测试
的方法没有生成?编译器真正要做的是将指针传递给
指针方法
,而不是调用不存在的生成方法。是的,不生成任何方法。退房,非常感谢@安克尔