go - 对嵌入在 golang 结构中的接口感到困惑
问题描述
就像这里的代码一样,当将接口 A 嵌入到结构 B 中时,然后将 A 设置为 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}
}
解决方案
嵌入式字段通过它们的类型名称访问,并且接口的字段只能通过断言基础类型来访问,因此将为b.A.(AA).X
您提供. 但是,如果您需要访问字段,则可能无论如何都不应该嵌入接口类型,而应该嵌入具体类型。X
AA
b.A
推荐阅读
- sql - 无法使用以下查询检索日期
- c# - 无法将 IQueryable 类型隐式转换为类
- python - Weird platform movement in pygame side-scrolling platformer
- c# - How to avoid so many disconnects in IoT-edge module
- python - 我使用偏移量来访问 LMDB 数据库中的元素,但它太慢了。这是为什么?
- swiftui - 如何在 SwiftUI 中使用带有 ObservedObject 的 Picker?
- python - Python script runs flawless when executed in shell, but throws unicode errors when executed as systemd service
- macos - How do I prevent an application from being used as a default opener for ANY file?
- python - 如何在python中降低这个嵌套循环代码的时间复杂度
- r - How do I turn a string of words into an edgelist?