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