Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何得到孩子';戈朗的s型_Go - Fatal编程技术网

Go 如何得到孩子';戈朗的s型

Go 如何得到孩子';戈朗的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 :=

我最近一直在学习围棋。 在下面的样本中,我得到的是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()
}

因为只有一个
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,我需要改变我的思维方式