Generische variadische Argumentation in Go
Go mangelt es an Vorlagen und überladenen Funktionen, aber es bietet eine Lösung, um einen Anschein einer generischen Programmierung in variadisch zu erreichen Funktionen.
Herausforderung:
Zahlreiche Funktionen mit ähnlichen Strukturen, wie zum Beispiel:
<code class="go">func (this Document) GetString(name string, defaults ...string) string { v, ok := this.GetValueFromDb(name) if !ok { if len(defaults) >= 1 { return defaults[0] } else { return "" } } return v.asString } func (this Document) GetInt(name string, defaults ...int) int { v, ok := this.GetValueFromDb(name) if !ok { if len(defaults) >= 1 { return defaults[0] } else { return 0 } } return v.asInt } // etc. for various types</code>
Lösung:
Die Verwendung des Typs „Schnittstelle{}“ ermöglicht eine generische Funktion:
<code class="go">func (this Document) Get(name string, defaults ...interface{}) interface{} { v, ok := this.GetValueFromDb(name) if !ok { if len(defaults) >= 1 { return defaults[0] } else { return nil } } return v }</code>
Die Funktion „GetValueFromDb“ sollte ebenfalls eine Schnittstelle{} zurückgeben. Im Client-Code können Werte mithilfe der Typzusicherung konvertiert und abgerufen werden:
<code class="go">value := document.Get("index", 1).(int) // Panics if the value is not an int</code>
oder
<code class="go">value, ok := document.Get("index", 1).(int) // ok is false if the value is not an int</code>
Obwohl dies zu einem gewissen Laufzeitaufwand führt, können die Umstrukturierung des Codes und die Trennung von Funktionen effizienter sein .
Das obige ist der detaillierte Inhalt vonWie können generische variadische Funktionen ohne Vorlagen erreicht werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!