如何向差异化的 Go 结构添加共享功能
在 Go 中,您可能会遇到需要向共享结构添加通用方法的情况特定字段,例如以下示例中的 Guid 字段:
type ModelA struct { Guid string `orm:"pk"` FiledA string } type ModelB struct { Guid string `orm:"pk"` FiledB string }
传统上,人们可能会考虑使用基本结构并将其嵌入到 ModelA 和 ModelB 中。然而,这种方法可能无法与 orm 库无缝配合。
一个可行的解决方案涉及使用接口。通过定义接口,您可以声明 ModelA 和 ModelB 都必须实现的通用契约:
type Savable interface { Save() }
接下来,为两个结构实现 Save() 方法:
func (a ModelA) Save() { // Implementation for ModelA } func (b ModelB) Save() { // Implementation for ModelB }
现在,您可以创建一个 Savable 类型的变量并将其分配给 ModelA 或 ModelB:
var i Savable i = ModelA{} i.Save()
或者,您可以使用嵌入类型方法:
type ModelC struct { Guid string `orm:"pk"` } type ModelA struct { ModelC FiledA string } type ModelB struct { ModelC FiledB string }
在这种情况下,在嵌入式 ModelC 结构中定义 Save() 方法:
func (c ModelC) Save() { // Implementation }
虽然这种方法看起来很简单,但需要注意的是,o.Insert(this) 语句只会插入 ModelC 上定义的字段,而不是那些在 ModelA 和 ModelB 上。
因此,当您仍然需要显式引用嵌入类型时,建议避免使用嵌入。在这种情况下,接口方法提供了更大的灵活性。
以上是如何高效地为不同字段的 Go 结构体添加共享功能?的详细内容。更多信息请关注PHP中文网其他相关文章!