Heim >Backend-Entwicklung >Golang >Wie verwalte ich Funktionen für ähnliche Go-Strukturen mit gemeinsam genutzten Feldern?

Wie verwalte ich Funktionen für ähnliche Go-Strukturen mit gemeinsam genutzten Feldern?

DDD
DDDOriginal
2024-10-29 04:52:02271Durchsuche

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

Best Practice von Go: Funktionen für ähnliche Strukturen mit gemeinsamen Feldern verwalten

In Go kommt es häufig vor, dass mehrere Strukturen mit ähnlichen Feldern vorhanden sind Es besteht die Notwendigkeit, identische Operationen an ihnen durchzuführen. Um Codewiederholungen zu vermeiden und gleichzeitig die Flexibilität zu wahren, ziehen Sie die folgenden Strategien in Betracht:

Erstellen eines benutzerdefinierten Typs für das freigegebene Feld:

Wenn das freigegebene Feld ein einfacher Datentyp ist ( (z. B. Zeichenfolge) sollten Sie darüber nachdenken, einen benutzerdefinierten Typ dafür zu definieren. Dadurch können Sie Methoden an den benutzerdefinierten Typ anhängen, die dann von jeder Struktur verwendet werden können, die diesen Typ einbettet.

<code class="go">type Version string

func (v Version) PrintVersion() {
    fmt.Println("Version is", v)
}</code>

Dann betten Sie den Versionstyp in die Strukturen ein:

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

type ERP struct {
    Name               string
    MRPSupport         bool
    SupportedDatabases []string
    Version
}</code>

Dadurch können Sie die Version mit der PrintVersion-Methode im Versionsfeld drucken:

<code class="go">g.PrintVersion()
e.PrintVersion()</code>

Mit Reflection:

Wenn das gemeinsame Feld unterschiedliche Typen haben kann Wenn Sie mehr Flexibilität wünschen, können Sie Reflektion verwenden, um die entsprechende Methode dynamisch aufzurufen. Dieser Ansatz ist komplexer und hat einige Auswirkungen auf die Leistung, bietet aber mehr Flexibilität.

<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>

Sie können dann die PrintVersion-Funktion verwenden, um die PrintVersion-Methode für jedes Objekt aufzurufen, das die Druckerschnittstelle implementiert:

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

PrintVersion(game)
PrintVersion(erp)</code>

Das obige ist der detaillierte Inhalt vonWie verwalte ich Funktionen für ähnliche Go-Strukturen mit gemeinsam genutzten Feldern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn