golang中嵌入在struct中的接口混淆

golang中嵌入在struct中的接口混淆,go,Go,就像这里的代码一样,将接口A嵌入结构B,然后将A设置为aa,这是aa的一个实例。B和AA都有元素X,当调用B.X时,我刚刚得到了B.X。我怎样才能得到B.AA.X?我知道这种语法是有线的,但我只是想弄清楚var b是如何存储在内存中的,我尝试了一些不安全的语法,没有办法得到b.A.X: package main import ( "fmt" "unsafe" ) type A interface { Hello() string } type B struct {

就像这里的代码一样,将接口A嵌入结构B,然后将A设置为aa,这是aa的一个实例。B和AA都有元素X,当调用B.X时,我刚刚得到了B.X。我怎样才能得到B.AA.X?我知道这种语法是有线的,但我只是想弄清楚var b是如何存储在内存中的,我尝试了一些不安全的语法,没有办法得到b.A.X:

package main

import (
    "fmt"
    "unsafe"
)

type A interface {
    Hello() string
}

type B struct {
    A
    X string
}

type AA struct {
    num int
    X   string
}

func (aa AA) Hello() string {
    return fmt.Sprintf("hello %d from %s", aa.num, aa.X)
}

func main() {
    aa := AA{200, "golang"}
    b := B{A: aa, X: "python"}
    fmt.Println(b.X)                                          // output: python
    fmt.Printf("--->%d\n", ((*AA)(unsafe.Pointer(&b.A)).num)) // output:  --->17667104
    fmt.Printf("===>%+v\n", b.A)                              // output: ===>{num:200 X:golang}
}

嵌入字段通过其类型名称访问,接口字段只能通过断言底层类型访问,因此
b.A.(AA).X
将获得
b.A
中底层
AA
的字段
X
。但是,如果您需要访问字段,那么可能不应该嵌入接口类型,而应该嵌入具体类型