根据this question,golang会同时生成type-receiver method
和point-receiver method
,这意味着下面的代码将正常运行,并且值会意外地发生变化。
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如何实际处理方法调用?
答案 0 :(得分:1)
当你说:
func (test *Test) modify() {
test.a++
}
这意味着接口Modifiable
由类型*Test
实现,即测试指针
在哪里
func (test Test) modify() {
test.a++
}
表示接口由类型Test
结论是:一种类型和指向该类型的指针是两种不同的类型。
答案 1 :(得分:0)
如果你想使用一个有指针接收器的方法。这意味着你必须传递地址值。
这是一个例子:
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)
}
总之,只要在方法中创建指针接收器,接口就会接受地址值。