如何在golang中获得孩子的类型

时间:2016-12-14 06:17:20

标签: go

我最近一直在研究Go。 在下面的样本中,我得到了类型a,而不是b。为什么? 我怎么得到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()
}

1 个答案:

答案 0 :(得分:2)

您始终拥有A值,因为您只有一个say()方法指向A结构。

因此,当您将say()方法应用于B结构时,编译器将查看B结构及其文件以查找是否存在B结构的say()方法或者是否存在任何结构具有say()方法的B结构字段。

在你的情况下,B struct没有任何指向它的方法。但是它有一个结构A结构并且具有say()方法的字段。

因此,每当您在B结构中调用say()方法时,您都会调用B.A.say()来打印A值。

否则,如果要打印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

运行此代码