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が実際にメソッド呼び出しを処理する方法は?
しかし、 'test'変数には' modify'というメソッドがあり、 'test.modify()'で呼び出すことができます。なぜ 'TestはModifiable'を実装していません。 – KIDJourney
あなたは 'Test'ではなく' * Test'でインタフェースを実装しているからです。 'modify'メソッドは' Test'型ではなく '* Test'に対して定義されています。 'test.modify'を呼び出すとき、コンパイラは自動的に' * Test'を渡しますが、インタフェースの実装上の観点から明示的に '* Test'を使う必要があります – Ankur
したがって、与えられたリンクの答えが間違っているので、' Test 'は生成されませんか?コンパイラが実際に行うことは、存在しない生成メソッドを呼び出す代わりに、ポインタを 'pointer-method'に渡すことです。 – KIDJourney