Heim > Backend-Entwicklung > Golang > Wie vermeide ich eine Speicherneuzuweisung in variadischen Wrapper-Funktionen?

Wie vermeide ich eine Speicherneuzuweisung in variadischen Wrapper-Funktionen?

Mary-Kate Olsen
Freigeben: 2024-11-02 18:19:02
Original
657 Leute haben es durchsucht

How to Avoid Memory Reallocation in Variadic Wrapper Functions?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage