我正在研究golang作为我的web-backend的新goto语言。我当前的语言是PHP,我在其中实现了类似于Backbone Collection / Model结构的数据结构。
这意味着我的Collection
包含多个Models
。 Models
有一个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中发挥作用。我读了很多关于嵌入/组合的介绍。但是根本不要理解这个问题。
这就是我的立场,请记住,这是我学习"继承"概念,而不是生产就绪的集合/模型实现。
我得到的是我没有理解"如何写一个"泛型"接受不完全继承类型的方法。我觉得我必须在某个地方使用一个接口才能获得这个"继承" /"扩展类"感觉。但我目前使用的是......好吧......
但也许我完全错误地实现了我想要的结构的概念?也许有一种更优雅的方式。任何提示都非常感谢!
答案 0 :(得分:0)
你已经非常接近正确,但你已经混淆了多种不同的东西。
完整示例:https://play.golang.org/p/wpj82QRVUP
所以你有两个模型User
,Address
,它们都有共同的字段和方法。这是为Model
创建公共结构的一个很好的理由,如上面的链接所示。 所有三种结构都是不同类型的。
您可以拥有一组接口或已定义类型的集合。那么何时使用哪个?
如果您有一组地址,请定义以下类型:
type AddrCollection []*Address
。然后在AddrCollection
类型上实现您想要的任何方法。
如果您有一组模型,请同样定义type ModelCollection []*Model
,但是将Address
传递给ModelCollection
则需要"提取"嵌入式。
如果你有一些东西的集合,那么定义一个接口集合(示例中为DescriberCollection
),但是你不会在其上定义GetByAddress()
,它只存在于{ {1}}
他们没有字段,只定义要实现的方法签名。在Go中,接口通常被接受并且永远不会返回,这为您提供了清洁和面向目标的设计的好处。接口是一种允许其他用户(或其他软件包)以不需要实现类型的方式使用软件包/库的方法,而是某种方法。他们可以重用您定义的类型,或者他们可以插入自己的接口实现。那么什么是界面,这是一种说法:这里是一组方法签名,只要你实现它们就可以使用我的包
答案 1 :(得分:0)