如何為差異化的 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中文網其他相關文章!