dpevsxjn809817
2019-01-07 16:40 浏览 179
已采纳

在golang的struct中嵌入的接口感到困惑

Like code here, when embedding an interface A into struct B, and then set A to aa which is an instance of AA. Both B and AA have element X, when call b.X I just got B.X. How can I get b.AA.X? I know this syntax is wired, but I just want to figure out how var b is stored in the memory, I tried some unsafe syntax, no way to get 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
", ((*AA)(unsafe.Pointer(&b.A)).num)) // output:  --->17667104
    fmt.Printf("===>%+v
", b.A)                              // output: ===>{num:200 X:golang}
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答 默认 最新

  • 已采纳
    duanlun1955 duanlun1955 2019-01-07 16:53

    Embedded fields are accessed by their type name, and fields of an interface are only accessible by asserting the underlying type, so b.A.(AA).X will get you field X of the underlying AA that's in b.A. But if you're needing to access fields, you probably shouldn't be embedding the interface type anyway, you should be embedding the concrete type.

    点赞 评论 复制链接分享

相关推荐