如何在 Go 中实现具有公共字段的结构体的共享方法
当处理共享公共字段的多个结构体时,经常需要为这些结构实现一个通用方法。虽然继承或混合看起来像是可行的方法,但它们在 Go 中面临局限性。
一种方法是定义一个指定所需方法的接口,如下所示:
type Savable interface { Save() } // Satisfy Savable for ModelA func (m ModelA) Save() { // Implement Save() for ModelA } var i Savable i = SomeMethodThatReturnsMyModel() i.Save() // Call Save() on the implementing type SomeOtherMethodThatAcceptsASavableAndCallsSave(i)
或者,嵌入可用于实现代码重用。然而,这需要仔细考虑,因为嵌入字段在调用 o.Insert(this) 时不会被插入,除非它们也在嵌入类型中定义。
type ModelC struct { Guid string `orm:"pk"` } func (m ModelC) Save() { // Implement Save() for ModelC } type ModelA struct { ModelC FiledA string } type ModelB struct { ModelC FiledB string }
重要的是要记住嵌入并不支持基于继承的方法重写。在嵌入结构中重新定义 Save() 并在重新定义中调用基类的方法在 Go 中并不被认为是一个好的做法。
在考虑两种方法之间时,必须评估具体要求和权衡涉及。接口方法提供了更大的灵活性,而嵌入可以提供性能优势,但需要仔细考虑嵌入字段的行为。
以上是如何实现具有公共字段的 Go 结构体的共享方法?的详细内容。更多信息请关注PHP中文网其他相关文章!