golang 继承实现 backbone 类集合/模型

golang inheritance to implement backbone like collection / model

我正在研究 golang 作为我的网络后端的新 goto 语言。我当前的语言是 PHP,我在其中实现了类似于 Backbone Collection/Model 结构的数据结构。

附注集/模型

这意味着我有一个包含多个 ModelsCollectionModels 有一个 attributes 字典用于存储实际的 "public data"。 Collections 有多种对 Models 的数组进行操作的便捷方法(排序、getByIndex、getByMatchingParameter 等)。 Models也有自己分享的便捷方法

在日常生活中,90% 的 "things" 都是以相同的方式表示的。例如,我可以像存储 User 一样存储 Address。有了包含我的 AddressesAddressesCollection,我可以简单地要求我的 AddressesCollection 给我所有 AddressModels,其中 city=Berlin。并在我的基础 class 中实现此匹配我可以在我的 UserCollection 上做逻辑上相同的事情给我所有被 deactivated=true 停用的用户。

但有时(10%)我需要一种特殊的方法。 getGeoData 例如 Addresses。现在,在我的 oop 世界中,我可以简单地创建一个新的 class 扩展我的 BaseModel 添加我的方法并在使用我的基础 class 的任何地方使用我的扩展 class。

我的"i simply don't get it"

这在 Go 中是如何工作的。我读了很多关于嵌入/合成的介绍。但是根本不要让我头疼。

这就是我的立场,请记住这是我学习 "inheritance" 概念的游乐场,而不是用于生产就绪的集合/模型实现。

GoPlayground

我得到的是我还没有 "understood" 如何编写一个 "generic" 方法来接受不完全继承的类型。我有一种感觉,我必须在某处使用一个界面来获得这种 "inheritance"/"extended class" 的感觉。但我目前使用的是......好吧......

但也许我完全错误地实现了我想要的结构的概念?也许有一种更优雅的方式。非常感谢任何提示!

你已经很接近正确了,但是你混淆了多个不同的东西。

完整示例:https://play.golang.org/p/wpj82QRVUP

  1. 类型嵌入

因此您有两个模型 UserAddress,它们共享共同的领域,也许还有共同的方法。这是为两者创建通用结构的一个很好的理由:Model,如上面的 link 所示。 所有三个结构都是不同的类型

  1. Collections

您可以拥有 collection 个接口或 collection 个已定义类型。那么什么时候使用哪个呢?

如果你有collection个地址,定义如下类型: type AddrCollection []*Address。然后在 AddrCollection 类型上实现你想要的任何方法。

如果您有 collection 个模型,类似地定义 type ModelCollection []*Model,但随后将 Address 传递给 ModelCollection 将需要 "extract" 嵌入类型。

如果你有一个 collection 的东西,那么定义一个 collection 的接口(示例中的 DescriberCollection),但是你不会有 GetByAddress() 定义在上面,它只会存在于 AddrCollection

  1. 接口

它们没有字段,它们只定义要实现的方法签名。在 Go 中,接口通常被接受并且永远不会返回,这给了你一个好处,让你拥有干净和 goal-oriented 的设计。接口是一种允许其他用户(或其他包)使用您的 packages/libraries 的方式,他们不需要实现您的类型,而是某些方法。他们可以重用您定义的类型,或者他们可以 plug-in 他们自己的接口实现。那么什么是接口呢,就是一种说法:这里有一套方法签名,只要你实现了就可以使用我的包

好吧,看来我真的不明白这样做的方法。

帮助我继续前进的流行语:

  • ORM
  • 去生成

看起来可以解决我的问题的项目:

无论如何感谢您的回答!