2016-12-14 8 views
0

私は最近Goを勉強してきました。 アンダーサンプルでは、​​bではなくタイプaを取得しました。どうして? そして、どうすればbを得ることができますか?ゴランの子供のタイプを取得する方法

// parent 
type A struct { 
    foo string 
} 

func (a *A) say() { 
    // I want b here, not a 
    fmt.Println(reflect.ValueOf(a).Type().String()) 
} 

// child 
type B struct { 
    A 
} 

func main() { 
    b := new(B) 
    b.say() 
} 
+3

埋め込みは**継承ではありません。親子関係やスーパー/サブクラス関係について考えることはまったく役に立ちません。それを停止する。 'b.say()'は* nothing *ですが、 'b.A.say()'の省略表記です。 'say'メソッドは常に' A'で呼び出されます。あなたがしようとしていることは不可能です。 – Volker

答えて

2

あなたは構造体を指すだけ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

+2

Thx、私は考え方を変える必要がある – yansen

関連する問題