„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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?

Veröffentlicht am 08.11.2024
Durchsuche:789

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

Go Best Practice: Funktionen für ähnliche Strukturen mit gemeinsam genutzten 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.

type Version string

func (v Version) PrintVersion() {
    fmt.Println("Version is", v)
}

Dann betten Sie den Versionstyp in die Strukturen ein:

type Game struct {
    Name               string
    MultiplayerSupport bool
    Genre              string
    Version
}

type ERP struct {
    Name               string
    MRPSupport         bool
    SupportedDatabases []string
    Version
}

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

g.PrintVersion()
e.PrintVersion()

Reflection verwenden:

Wenn das gemeinsam genutzte Feld verschiedene Typen haben kann oder Sie mehr Flexibilität wünschen, können Sie Reflection verwenden, um das entsprechende Feld dynamisch aufzurufen Verfahren. Dieser Ansatz ist komplexer und hat einige Auswirkungen auf die Leistung, bietet aber mehr Flexibilität.

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

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

var game Game
var erp ERP

PrintVersion(game)
PrintVersion(erp)
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3