被 golang 中嵌入结构的接口搞糊涂了

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


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}

}


慕妹3146593
浏览 106回答 1
1回答

烙印99

嵌入式字段是通过它们的类型名称访问的,而接口的字段只能通过声明底层类型来访问,所以你b.A.(AA).X会得到. 但是如果你需要访问字段,你可能不应该嵌入接口类型,你应该嵌入具体类型。XAAb.A
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go