gpt4 book ai didi

go - 从另一个包导入结构时私有(private)嵌入式结构

转载 作者:IT王子 更新时间:2023-10-29 01:55:12 27 4
gpt4 key购买 nike

我有一个项目依赖于从另一个包导入的结构,我将其称为 TheirEntity

在下面的示例中,我(咳咳)将 TheirEntity 嵌入到 MyEntity 中,它是 TheirEntity 的扩展,具有附加功能。

但是,我不想在 MyEntity 结构中导出 TheirEntity,因为我希望消费者不要直接访问 TheirEntity

我知道 Go 嵌入与经典 OOP 中的继承不同,所以这可能不是正确的方法,但是是否可以将嵌入结构指定为“私有(private)”,即使它们是从另一个包导入的?如何以更惯用的方式实现同​​样的目标?

// TheirEntity contains functionality I would like to use...

type TheirEntity struct {
name string
}

func (t TheirEntity) PrintName() {
fmt.Println(t.name)
}

func NewTheirEntity(name string) *TheirEntity {
return &TheirEntity{name: name}
}

// ... by embedding in MyEntity

type MyEntity struct {
*TheirEntity // However, I don't want to expose
// TheirEntity directly. How to embed this
// without exporting and not changing this
// to a named field?

color string
}

func (m MyEntity) PrintFavoriteColor() {
fmt.Println(m.color)
}

func NewMyEntity(name string, color string) *MyEntity {
return &MyEntity{
TheirEntity: NewTheirEntity(name),
color: color,
}
}

最佳答案

既然问了这个问题,Go 看到了 type aliases 的添加使用 1.9 release 的语言2017 年。事实证明,通过非常规地使用类型别名,您可以吃蛋糕也可以吃!

首先,为您希望嵌入到您的结构中的第三方类型声明一个未导出的别名:

type theirEntity = TheirEntity

然后,简单地嵌入别名而不是原始类型:

type MyEntity struct {
*theirEntity
color string
}

( Playground )

关于go - 从另一个包导入结构时私有(private)嵌入式结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33908672/

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