Inheritance golang继承以实现主干类集合/模型
我正在研究golang作为我的web后端的新goto语言。我目前在那里使用的语言是PHP,在那里我实现了一个类似于主干集合/模型结构的数据结构 excursus集合/模型 这意味着我有一个包含多个Inheritance golang继承以实现主干类集合/模型,inheritance,go,data-structures,collections,embedding,Inheritance,Go,Data Structures,Collections,Embedding,我正在研究golang作为我的web后端的新goto语言。我目前在那里使用的语言是PHP,在那里我实现了一个类似于主干集合/模型结构的数据结构 excursus集合/模型 这意味着我有一个包含多个模型的集合模型有一个属性字典,用于存储实际的“公共数据”集合有多种方便的方法在模型数组上操作(排序、getByIndex、getByMatchingParameter等)模型也有自己的便利方法 在日常生活中,90%的“事物”以同样的方式呈现。例如,我可以像存储我的用户一样存储地址。拥有一个包含我的地址的
模型的集合
<代码>模型
有一个属性
字典,用于存储实际的“公共数据”<代码>集合有多种方便的方法在模型数组
上操作(排序、getByIndex、getByMatchingParameter等)<代码>模型也有自己的便利方法
在日常生活中,90%的“事物”以同样的方式呈现。例如,我可以像存储我的用户一样存储地址
。拥有一个包含我的地址的地址集合
,我可以简单地要求我的地址集合
给我所有地址模型
,其中城市=柏林
。在我的基类中实现这个匹配,我可以在我的UserCollection
上做逻辑上相同的事情,给我所有被deactivated=true
停用的用户
但有时(10%)我需要一种特殊的方法<例如,地址的code>getGeoData
。现在,在我的oop世界中,我可以简单地创建一个扩展我的BaseModel
的新类,添加我的方法,并在使用我的基类的任何地方使用我的扩展类
我的“我就是不明白”
这在Go中是如何工作的。我读了很多关于嵌入/合成的介绍。但我就是不明白这一点
这就是我的立场,请记住,这是我学习“继承”概念的游乐场,而不是为生产准备好的集合/模型实现
我得到的是,我还没有“理解”如何编写一个“泛型”方法来接受不完全继承的类型。我觉得我必须在某个地方使用一个接口来获得这种“继承”/“扩展类”的感觉。但我现在用的是。。。嗯
但也许我在go中实现我想要的结构的想法是完全错误的?也许有一种更优雅的方式。非常感谢任何提示 你很快就要把事情做好了,但是你把很多不同的事情都搞错了
完整示例:
类型嵌入
因此,您有两个模型User
,Address
,它们都共享公共字段,也可能共享方法。这是为这两个模型创建公共结构的一个很好的理由:Model
,如上面的链接所示所有三个结构都是不同类型的
收藏
您可以拥有接口集合或已定义类型集合。那么什么时候使用哪一种呢
如果您有一个地址集合,则定义的地址类型如下:
键入AddrCollection[]*地址
。然后在AddrCollection
type上实现您想要的任何方法
如果您有一个模型集合,则类似地定义type ModelCollection[]*Model
,但将Address
传递给ModelCollection
将需要“提取”嵌入的类型
如果您有一个某物的集合,那么就定义一个接口集合(DescriberCollection
,在本例中),但是您不会在其上定义GetByAddress()
,它将只存在于AddrCollection
接口
它们没有字段,只定义要实现的方法签名。In-Go接口通常被接受,并且永远不会返回,这给了你一个干净的、面向目标的设计的好处。接口是一种允许其他用户(或其他包)使用您的包/库的方式,他们不需要实现您的类型,而需要实现特定的方法。他们可以重用您定义的类型,也可以插入自己的接口实现。那么什么是接口,这是一种说法:这里是一组方法签名,只要你实现了它们,你就可以使用我的软件包你很快就能把它做好,但是你把多个不同的东西混在一起了
完整示例:
类型嵌入
因此,您有两个模型User
,Address
,它们都共享公共字段,也可能共享方法。这是为这两个模型创建公共结构的一个很好的理由:Model
,如上面的链接所示所有三个结构都是不同类型的
收藏
您可以拥有接口集合或已定义类型集合。那么什么时候使用哪一种呢
如果您有一个地址集合,则定义的地址类型如下:
键入AddrCollection[]*地址
。然后在AddrCollection
type上实现您想要的任何方法
如果您有一个模型集合,则类似地定义type ModelCollection[]*Model
,但将Address
传递给ModelCollection
将需要“提取”嵌入的类型
如果您有一个某物的集合,那么就定义一个接口集合(DescriberCollection
,在本例中),但是您不会在其上定义GetByAddress()
,它将只存在于AddrCollection
接口
它们没有字段,只定义要实现的方法签名。In-Go接口通常被接受,并且永远不会返回,这给了你一个干净的、面向目标的设计的好处。接口是一种允许其他用户(或其他包)使用您的包/库的方式,他们不需要实现您的类型,而需要实现特定的方法。它们可以重用您定义的类型,也可以插入