gpt4 book ai didi

go - Go中没有方法的结构的多态性

转载 作者:行者123 更新时间:2023-12-01 22:36:35 25 4
gpt4 key购买 nike

我正在使用 Go 开发几个 Web 服务器项目,并且我一直面临一个常见问题。我知道我们可以通过接口(interface)和方法在 Go 中实现多态性之类的东西,但很多时候我有一个场景,我需要在一些数据持有者结构上实现多态性,这些(可能)只有一些公共(public)字段,而根本没有方法。

例如考虑一个故事写作平台,每个用户都可以写短篇小说和小说:

type ShortStory struct {
Name string
ID int
Body string
}

type LongStory struct {
Name string
ID int
Chapters []string
}

现在我只想拥有一个数据层功能,比如 GetStories() ,它从数据库中获取用户编写的所有故事。
func GetStories(id int) []SOME_TYPE {
...
}

我的 ShortStory 上真的没有我想要的方法。和 LongStory结构。我知道我可以添加一个虚拟方法并让它们满足一些 Storier接口(interface),然后将该接口(interface)用作返回类型。但是由于在数据容器模型上没有我想要的方法,因此仅为语言添加虚拟方法以启用功能,对我来说似乎是一个糟糕的设计选择。

我也可以让函数返回 []interface{} ,但这与我相信的“类型化语言”的整个​​想法背道而驰。

另一种方法是有两个单独的 GetShortStories()GetLongStories()方法,它们返回自己类型的 slice 。但在某些时候,我最终想将这两个 slice 合并为一个,在那里我再次需要一个 []interface{} .是的,我可以返回如下 JSON:
{
"short_stories" : [...],
"long_stories" : [...]
}

但我希望我的 json 像:
[{...}, {...}, {...}]

而且我不会因为语言的限制而改变我的 API!

我不是围棋专家,所以我在这里遗漏了什么吗?有没有 去吧 解决这个问题,还是 Golang 方面的语言设计真的很糟糕?

最佳答案

如果你不能用语言的特性来表达你想做的事情,你应该首先尝试改变你构建程序的方式,然后再责怪语言本身。有些概念在 Go 中无法表达,但在其他语言中可以很好地表达,有些概念在其他语言中无法很好地表达,但在 Go 中可以。改变解决问题的方式以有效地使用语言。

解决问题的一种方法是使用不同类型的结构:

type Story struct {
Name string
ID int
ShortBody string
Chapters []string
}

如果 Chapters是空的,那么它是一个短篇小说。

其他方式:
type Story struct {
Name string
ID int
Content StoryContent
}

type StoryContent interface {
Type() string
}

type ShortStory interface {
StoryContent
Body() string
}

type LongStory interface {
StoryContent
Chapters() []string
}

等等

关于go - Go中没有方法的结构的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61399147/

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