我最近一直在研究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()
}
答案 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
运行此代码