2016-12-14 2 views
0

나는 최근에 Go을 공부했습니다. 아래 샘플에서 b가 아닌 a 유형을 얻었습니다. 왜? 그리고 어떻게 얻을 수 있습니까?골란에서 아이의 타입을 얻는 방법

+3

삽입은 ** 상속 **이 아닙니다. 부모/자식 또는 슈퍼/서브 클래스 관계에 대해 생각하는 것은 전혀 도움이되지 않습니다. 그만. 'b.say()'는 * nothing *이지만'b.A.say()'의 속기 표기법입니다 :'say' 메소드는 항상'A'에서 호출됩니다. 당신이하려고하는 것은 불가능합니다. – Volker

답변

2

구조체를 가리키는 say() 메서드가 하나뿐이므로 항상 A 값을 얻습니다.

say() 메서드를 B 구조체에 적용하면 컴파일러는 B 구조체의 say() 메서드가 있는지 또는 B 구조체의 메서드가 있는지 찾는 데 B 구조체와 해당 fileds를 찾습니다. say() 방법.

귀하의 경우, B 구조체에는이를 가리킬 방법이 없습니다. 하지만 구조체를 구현하고 say() 메서드를 가진 필드가 있습니다.

따라서 구조체 내에서 say() 메서드를 호출 할 때마다 B.A.say()을 호출하면 A 값이 인쇄됩니다. 당신은 B와 값을 인쇄하려면

그렇지 않으면,이 예처럼 뭔가 코드를 수정할 수 있습니다

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

관련 문제