golang继承实现了像集合/模型这样的骨干

时间:2017-06-10 07:36:18

标签: inheritance go data-structures collections embedding

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

excursus Collection / Model

这意味着我的Collection包含多个ModelsModels有一个attributes字典用于存储实际的"公共数据"。 Collections有多个便捷方法在Models数组上运行(sort,getByIndex,getByMatchingParameter等)。 Models也有一些便利方法。

在日常生活中,将会有90%的事情发生在"以同样的方式表示。例如,我可以像存储Address一样存储User。如果AddressesCollection包含我的Addresses,我可以简单地让AddressesCollection给我AddressModels所有city=Berlin。在我的基类中实现此匹配,我可以在UserCollection上执行逻辑上相同的操作,向我提供由deactivated=true停用的所有用户。

但有时候(10%)我需要一种特殊的方法。 getGeoData代表Addresses。现在,在我的oop-world中,我可以简单地创建一个新类,扩展我的BaseModel添加我的方法,并在我的基类被使用的地方使用我的扩展类。

我的"我根本就没有得到它"

这如何在Go中发挥作用。我读了很多关于嵌入/组合的介绍。但是根本不要理解这个问题。

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

GoPlayground

我得到的是我没有理解"如何写一个"泛型"接受不完全继承类型的方法。我觉得我必须在某个地方使用一个接口才能获得这个"继承" /"扩展类"感觉。但我目前使用的是......好吧......

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

2 个答案:

答案 0 :(得分:0)

你已经非常接近正确,但你已经混淆了多种不同的东西。

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

  1. 类型嵌入
  2. 所以你有两个模型UserAddress,它们都有共同的字段和方法。这是为Model创建公共结构的一个很好的理由,如上面的链接所示。 所有三种结构都是不同类型的

    1. 收藏
    2. 您可以拥有一组接口或已定义类型的集合。那么何时使用哪个?

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

      如果您有一组模型,请同样定义type ModelCollection []*Model,但是将Address传递给ModelCollection则需要"提取"嵌入式。

      如果你有一些东西的集合,那么定义一个接口集合(示例中为DescriberCollection),但是你不会在其上定义GetByAddress(),它只存在于{ {1}}

      1. 接口
      2. 他们没有字段,只定义要实现的方法签名。在Go中,接口通常被接受并且永远不会返回,这为您提供了清洁和面向目标的设计的好处。接口是一种允许其他用户(或其他软件包)以不需要实现类型的方式使用软件包/库的方法,而是某种方法。他们可以重用您定义的类型,或者他们可以插入自己的接口实现。那么什么是界面,这是一种说法:这里是一组方法签名,只要你实现它们就可以使用我的包

答案 1 :(得分:0)

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

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

  • ORM
  • go generate

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

谢谢你的答案,无论如何!