gpt4 book ai didi

go - 被嵌入在golang结构中的接口(interface)所困惑

转载 作者:数据小太阳 更新时间:2023-10-29 03:31:25 27 4
gpt4 key购买 nike

像这里的代码,当把一个接口(interface)A嵌入到结构体B中,然后将A设置为aa,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}
}

最佳答案

嵌入式字段是通过它们的类型名称访问的,而接口(interface)的字段只能通过断言底层类型来访问,所以 b.A.(AA).X会给你场X标的AA那是在b.A .但是,如果您需要访问字段,您可能无论如何都不应该嵌入接口(interface)类型,而应该嵌入具体类型。

关于go - 被嵌入在golang结构中的接口(interface)所困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54078378/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com