golang 继承实现 backbone 类集合/模型
golang inheritance to implement backbone like collection / model
我正在研究 golang 作为我的网络后端的新 goto 语言。我当前的语言是 PHP,我在其中实现了类似于 Backbone Collection/Model 结构的数据结构。
附注集/模型
这意味着我有一个包含多个 Models
的 Collection
。 Models
有一个 attributes
字典用于存储实际的 "public data"。 Collections
有多种对 Models
的数组进行操作的便捷方法(排序、getByIndex、getByMatchingParameter 等)。 Models
也有自己分享的便捷方法
在日常生活中,90% 的 "things" 都是以相同的方式表示的。例如,我可以像存储 User
一样存储 Address
。有了包含我的 Addresses
的 AddressesCollection
,我可以简单地要求我的 AddressesCollection
给我所有 AddressModels
,其中 city=Berlin
。并在我的基础 class 中实现此匹配我可以在我的 UserCollection
上做逻辑上相同的事情给我所有被 deactivated=true
停用的用户。
但有时(10%)我需要一种特殊的方法。 getGeoData
例如 Addresses
。现在,在我的 oop 世界中,我可以简单地创建一个新的 class 扩展我的 BaseModel
添加我的方法并在使用我的基础 class 的任何地方使用我的扩展 class。
我的"i simply don't get it"
这在 Go 中是如何工作的。我读了很多关于嵌入/合成的介绍。但是根本不要让我头疼。
这就是我的立场,请记住这是我学习 "inheritance" 概念的游乐场,而不是用于生产就绪的集合/模型实现。
我得到的是我还没有 "understood" 如何编写一个 "generic" 方法来接受不完全继承的类型。我有一种感觉,我必须在某处使用一个界面来获得这种 "inheritance"/"extended class" 的感觉。但我目前使用的是......好吧......
但也许我完全错误地实现了我想要的结构的概念?也许有一种更优雅的方式。非常感谢任何提示!
你已经很接近正确了,但是你混淆了多个不同的东西。
完整示例:https://play.golang.org/p/wpj82QRVUP
- 类型嵌入
因此您有两个模型 User
、Address
,它们共享共同的领域,也许还有共同的方法。这是为两者创建通用结构的一个很好的理由:Model
,如上面的 link 所示。 所有三个结构都是不同的类型。
- Collections
您可以拥有 collection 个接口或 collection 个已定义类型。那么什么时候使用哪个呢?
如果你有collection个地址,定义如下类型:
type AddrCollection []*Address
。然后在 AddrCollection
类型上实现你想要的任何方法。
如果您有 collection 个模型,类似地定义 type ModelCollection []*Model
,但随后将 Address
传递给 ModelCollection
将需要 "extract" 嵌入类型。
如果你有一个 collection 的东西,那么定义一个 collection 的接口(示例中的 DescriberCollection
),但是你不会有 GetByAddress()
定义在上面,它只会存在于 AddrCollection
- 接口
它们没有字段,它们只定义要实现的方法签名。在 Go 中,接口通常被接受并且永远不会返回,这给了你一个好处,让你拥有干净和 goal-oriented 的设计。接口是一种允许其他用户(或其他包)使用您的 packages/libraries 的方式,他们不需要实现您的类型,而是某些方法。他们可以重用您定义的类型,或者他们可以 plug-in 他们自己的接口实现。那么什么是接口呢,就是一种说法:这里有一套方法签名,只要你实现了就可以使用我的包
好吧,看来我真的不明白这样做的方法。
帮助我继续前进的流行语:
- ORM
- 去生成
看起来可以解决我的问题的项目:
无论如何感谢您的回答!
我正在研究 golang 作为我的网络后端的新 goto 语言。我当前的语言是 PHP,我在其中实现了类似于 Backbone Collection/Model 结构的数据结构。
附注集/模型
这意味着我有一个包含多个 Models
的 Collection
。 Models
有一个 attributes
字典用于存储实际的 "public data"。 Collections
有多种对 Models
的数组进行操作的便捷方法(排序、getByIndex、getByMatchingParameter 等)。 Models
也有自己分享的便捷方法
在日常生活中,90% 的 "things" 都是以相同的方式表示的。例如,我可以像存储 User
一样存储 Address
。有了包含我的 Addresses
的 AddressesCollection
,我可以简单地要求我的 AddressesCollection
给我所有 AddressModels
,其中 city=Berlin
。并在我的基础 class 中实现此匹配我可以在我的 UserCollection
上做逻辑上相同的事情给我所有被 deactivated=true
停用的用户。
但有时(10%)我需要一种特殊的方法。 getGeoData
例如 Addresses
。现在,在我的 oop 世界中,我可以简单地创建一个新的 class 扩展我的 BaseModel
添加我的方法并在使用我的基础 class 的任何地方使用我的扩展 class。
我的"i simply don't get it"
这在 Go 中是如何工作的。我读了很多关于嵌入/合成的介绍。但是根本不要让我头疼。
这就是我的立场,请记住这是我学习 "inheritance" 概念的游乐场,而不是用于生产就绪的集合/模型实现。
我得到的是我还没有 "understood" 如何编写一个 "generic" 方法来接受不完全继承的类型。我有一种感觉,我必须在某处使用一个界面来获得这种 "inheritance"/"extended class" 的感觉。但我目前使用的是......好吧......
但也许我完全错误地实现了我想要的结构的概念?也许有一种更优雅的方式。非常感谢任何提示!
你已经很接近正确了,但是你混淆了多个不同的东西。
完整示例:https://play.golang.org/p/wpj82QRVUP
- 类型嵌入
因此您有两个模型 User
、Address
,它们共享共同的领域,也许还有共同的方法。这是为两者创建通用结构的一个很好的理由:Model
,如上面的 link 所示。 所有三个结构都是不同的类型。
- Collections
您可以拥有 collection 个接口或 collection 个已定义类型。那么什么时候使用哪个呢?
如果你有collection个地址,定义如下类型:
type AddrCollection []*Address
。然后在 AddrCollection
类型上实现你想要的任何方法。
如果您有 collection 个模型,类似地定义 type ModelCollection []*Model
,但随后将 Address
传递给 ModelCollection
将需要 "extract" 嵌入类型。
如果你有一个 collection 的东西,那么定义一个 collection 的接口(示例中的 DescriberCollection
),但是你不会有 GetByAddress()
定义在上面,它只会存在于 AddrCollection
- 接口
它们没有字段,它们只定义要实现的方法签名。在 Go 中,接口通常被接受并且永远不会返回,这给了你一个好处,让你拥有干净和 goal-oriented 的设计。接口是一种允许其他用户(或其他包)使用您的 packages/libraries 的方式,他们不需要实现您的类型,而是某些方法。他们可以重用您定义的类型,或者他们可以 plug-in 他们自己的接口实现。那么什么是接口呢,就是一种说法:这里有一套方法签名,只要你实现了就可以使用我的包
好吧,看来我真的不明白这样做的方法。
帮助我继续前进的流行语:
- ORM
- 去生成
看起来可以解决我的问题的项目:
无论如何感谢您的回答!