Variadic Wrapper ohne Speicherneuzuweisung
Variadic-Funktionen bieten Flexibilität bei der Parameterbehandlung, aber das Anhängen von Elementen an eine Wrapper-Funktion kann eine Speicherneuzuweisung auslösen. In diesem Artikel werden Lösungen untersucht, um dieses Problem zu vermeiden und gleichzeitig den Debugging-Komfort zu wahren.
Ein gängiger Ansatz zum Erstellen eines Variadic-Wrappers besteht darin, die Argumente direkt an die innere Funktion zu übergeben:
<code class="go">func Debug(a ...interface{}) { if debug { fmt.Fprintln(out, prefix, sep, a...) } }</code>
Dies jedoch kann zu „zu viele Argumente“-Fehlern führen. Ein anderer Ansatz besteht darin, vararg zum Umschließen der Argumente zu verwenden. Dies führt jedoch zu dem Fehler „Namensliste im Schnittstellentyp nicht zulässig“.
Eine scheinbar gültige Lösung besteht darin, einen temporären Slice zu erstellen und das Präfix, das Trennzeichen usw. einzufügen. und Argumente hinein:
<code class="go">func Debug(a ...interface{}) { if debug { sl := make([]interface{}, len(a)+2) sl[0] = prefix sl[1] = sep for i, v := range a { sl[2+i] = v } fmt.Fprintln(out, sl...) } }</code>
Dies funktioniert zwar, erfordert aber unnötige Speicherzuweisung.
Als Slick-Lösung anhängen
Effizienter Der Ansatz besteht darin, die Append-Funktion zu nutzen. Indem wir das Präfix und das Trennzeichen an die ursprünglichen Argumente anhängen, können wir eine Neuzuweisung des Speichers vermeiden:
<code class="go">func Debug(a ...interface{}) { if debug { fmt.Fprintln(out, append([]interface{}{prefix, sep}, a...)...) } }</code>
Dieser Einzeiler stellt das Präfix und das Trennzeichen effektiv den variadischen Argumenten voran, ohne ein neues Slice zu erstellen. Es ist prägnant, effizient und löst das Problem der Speicherzuweisung, ohne die Funktionalität des Variadic-Wrappers zu beeinträchtigen.
Das obige ist der detaillierte Inhalt vonWie vermeide ich eine Speicherneuzuweisung in variadischen Wrapper-Funktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!