Go 如何得到孩子';戈朗的s型
我最近一直在学习围棋。 在下面的样本中,我得到的是a型,不是b型。为什么? 我怎样才能得到bGo 如何得到孩子';戈朗的s型,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 :=
// 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()
}
因为只有一个
say()
方法指向一个结构,所以总是会得到A值
因此,当您将say()
方法应用于B struct时,编译器将查看B struct及其文件,以确定是否存在B struct的say()
方法,或者B struct的任何字段具有say()
方法
在您的例子中,B struct没有任何指向它的方法。但是它有一个字段,它包含一个结构,并且有一个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
您还可以使用运行此代码,因为您只有一个指向结构的
say()
方法,所以始终会得到A值
因此,当您将say()
方法应用于B struct时,编译器将查看B struct及其文件,以确定是否存在B struct的say()
方法,或者B struct的任何字段具有say()
方法
在您的例子中,B struct没有任何指向它的方法。但是它有一个字段,它包含一个结构,并且有一个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
您也可以使用运行此代码,嵌入不是继承。考虑父/子或超级/子类关系根本没有帮助。别说了
b.say()
不过是b.a.say()
的简写符号:方法say
总是在a
上调用。你试图做的是不可能的。嵌入不是继承。考虑父/子或超级/子类关系根本没有帮助。别说了b.say()
不过是b.a.say()
的简写符号:方法say
总是在a
上调用。你想做的是不可能的。Thx,我需要改变我的思维方式Thx,我需要改变我的思维方式