首頁 > 後端開發 > Golang > 如何管理具有共用欄位的類似 Go 結構的函數?

如何管理具有共用欄位的類似 Go 結構的函數?

DDD
發布: 2024-10-29 04:52:02
原創
259 人瀏覽過

How to Manage Functions for Similar Go Structs with Shared Fields?

Go 最佳實踐:管理具有共享字段的相似結構體的函數

在Go 中,經常會遇到多個具有相似字段的結構體,並且需要對它們執行相同的操作。為了在保持彈性的同時避免程式碼重複,請考慮以下策略:

為共用欄位建立自訂類型:

如果共用欄位是簡單資料類型(例如,字串),考慮為其定義自訂類型。這允許您將方法附加到自訂類型,然後嵌入該類型的任何結構都可以使用該方法。

<code class="go">type Version string

func (v Version) PrintVersion() {
    fmt.Println("Version is", v)
}</code>
登入後複製

然後,將Version 類型嵌入到結構中:

<code class="go">type Game struct {
    Name               string
    MultiplayerSupport bool
    Genre              string
    Version
}

type ERP struct {
    Name               string
    MRPSupport         bool
    SupportedDatabases []string
    Version
}</code>
登入後複製

這允許您在Version 欄位上使用PrintVersion 方法列印版本:

<code class="go">g.PrintVersion()
e.PrintVersion()</code>
登入後複製

使用反射:

如果共享欄位可以是不同類型或者,如果您想要更大的靈活性,可以使用反射來動態調用適當的方法。這種方法比較複雜,並且有一些效能影響,但它提供了更大的靈活性。

<code class="go">type Printer interface {
    PrintVersion() error
}

func PrintVersion(p Printer) error {
    t := reflect.TypeOf(p)
    method, ok := t.MethodByName("PrintVersion")
    if !ok {
        return fmt.Errorf("object doesn't have a PrintVersion method")
    }

    return method.Func.Call([]reflect.Value{reflect.ValueOf(p)})[0].Interface().(error)
}</code>
登入後複製

然後您可以使用 PrintVersion 函數在任何實作 Printer 介面的物件上呼叫 PrintVersion 方法:

<code class="go">var game Game
var erp ERP

PrintVersion(game)
PrintVersion(erp)</code>
登入後複製

以上是如何管理具有共用欄位的類似 Go 結構的函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板