2019-01-07 16:40 浏览 179


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 (

type A interface {
    Hello() string

type B struct {
    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
", ((*AA)(unsafe.Pointer(&b.A)).num)) // output:  --->17667104
", 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.

    点赞 评论 复制链接分享