登录
首页 >  Golang >  Go问答

对 golang 结构中嵌入的接口感到困惑

来源:stackoverflow

时间:2024-04-17 18:03:20 239浏览 收藏

大家好,今天本人给大家带来文章《对 golang 结构中嵌入的接口感到困惑》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

就像这里的代码一样,将接口 a 嵌入到结构体 b 中,然后将 a 设置为 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}
}

解决方案


嵌入式字段通过其类型名称进行访问,而接口的字段只能通过断言基础类型来访问,因此 b.A.(AA).X 将为您提供位于 b.A 中的基础 X 的字段 X 。但是如果您需要访问字段,您可能无论如何都不应该嵌入接口类型,您应该嵌入具体类型。

以上就是《对 golang 结构中嵌入的接口感到困惑》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>