あなたは構造体を指すだけsay()
方法を持っているので、あなたは常に値を得ました。
あなたはB構造体へsay()
方法を適用するとB構造体のsay()
方法があるか、持っているB構造体のいずれかのフィールドがあるのであれば、コンパイラは見つけるためにBの構造体とそのfiledsを見ていきますsay()
方法。
あなたの場合、Bの構造体には、それを指すメソッドはありません。しかし、構造体を共用し、say()
メソッドを持つフィールドがあります。
したがって、B構造体内でsay()
メソッドを呼び出すたびに、A値を出力するB.A.say()
を呼び出します。あなたはBとAの値を印刷したい場合は
そうでない場合、あなたは、この例のような何かにあなたのコードを変更することができます。
package main
import (
"fmt"
"reflect"
)
type A struct {
foo string
}
// This method will point to A struct
func (a *A) say() {
fmt.Println(reflect.ValueOf(a).Type().String())
}
type B struct {
A
}
// This method will point to B struct
func (a *B) say() {
fmt.Println(reflect.ValueOf(a).Type().String())
}
func main() {
b := new(B)
b.say() // expected output: *main.B
b.A.say() // expected output: *main.A
}
出力:あなたはまた、このコードを実行することができます
*main.B
*main.A
Go Playground
埋め込みは**継承ではありません。親子関係やスーパー/サブクラス関係について考えることはまったく役に立ちません。それを停止する。 'b.say()'は* nothing *ですが、 'b.A.say()'の省略表記です。 'say'メソッドは常に' A'で呼び出されます。あなたがしようとしていることは不可能です。 – Volker