【问题标题】:Extend golang struct扩展 golang 结构
【发布时间】:2023-03-30 15:12:02
【问题描述】:

我尝试扩展基本结构,如下所示:


import (
    "fmt"
)

type A struct {
    A bool
    C bool
}

type B struct {
    A
    B bool
}

func main() {
    fmt.Println("Hello, playground")
    a := A{
        A: false,
        C: false,
    }

    b := B{
        a,
        true,
    }

    fmt.Print(b)
}

但它创建了继承结构。这段代码的输出是:{{false false} true}

但我想得到{false false true}

有可能吗?

【问题讨论】:

  • “但我想得到” --- 这是一个 XY 问题。您真的只想这样打印,还是有其他原因您没有透露?
  • “有可能吗?”不,嵌入是组合,而不是继承。你将无法模仿继承。
  • fmt.Print(b) 是您真正想要的还是只是用于测试?如果您想使用 encoding/json 编码为 JSON,b 将使用所有顶级键 {"A":false,"C":false,"B":true} 编组。请参阅:play.golang.org/p/S3pS1PU_0WY
  • @zerkms 我想获得像{ A bool B bool C bool }这样的结构
  • @SergeyGorbunov 您对嵌套有什么实际问题?

标签: go struct embedding


【解决方案1】:

在“经典”OOP 意义上没有扩展,在结构中嵌入类型将添加嵌入结构的字段,而是添加一个 单个字段 type 为嵌入类型,可以通过非限定类型名称引用:b.A

如果你只是想让它按你想要的方式打印,你可以实现fmt.Stringer 接口:

func (b B) String() string {
    return fmt.Sprintf("{%t %t %t}", b.A.A, b.C, b.B)
}

然后输出会是这样的(在Go Playground 上试试):

{false false true}

但这就是它的结束。

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 1970-01-01
    • 2012-03-30
    • 2018-03-03
    • 1970-01-01
    • 2014-11-24
    • 2014-04-08
    • 2014-08-22
    • 1970-01-01
    相关资源
    最近更新 更多