Go 戈朗法接收机
根据,golang将生成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
类型接收器方法
和点接收器方法
,这意味着以下代码将正常工作,并且值将意外更改
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
时,编译器将自动通过*测试
,但从接口实现的角度来看,您需要显式使用*测试
,因此给定链接中的答案是错误的,测试
的方法没有生成?编译器真正要做的是将指针传递给指针方法
,而不是调用不存在的生成方法。是的,不生成任何方法。退房,非常感谢@安克尔