ホームページ  >  記事  >  バックエンド開発  >  可変引数ラッパー関数でのメモリの再割り当てを回避するにはどうすればよいですか?

可変引数ラッパー関数でのメモリの再割り当てを回避するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-02 18:19:02520ブラウズ

How to Avoid Memory Reallocation in Variadic Wrapper Functions?

メモリ再割り当てを使用しない可変個引数ラッパー

可変個引数関数はパラメーター処理に柔軟性をもたらしますが、ラッパー関数に項目を追加するとメモリの再割り当てがトリガーされる可能性があります。この記事では、デバッグの利便性を維持しながらこの問題を回避するための解決策を検討します。

可変個引数ラッパーを作成する一般的なアプローチの 1 つは、引数を内部関数に直接渡すことです。

<code class="go">func Debug(a ...interface{}) {
    if debug {
        fmt.Fprintln(out, prefix, sep, a...)
    }
}</code>

ただし、これは「引数が多すぎます」エラーが発生する可能性があります。別のアプローチは、vararg を使用して引数をラップすることですが、これにより「インターフェイス タイプでは名前リストが許可されていません」というエラーが発生します。

一見有効な解決策は、一時的なスライスを作成し、プレフィックス、区切り文字、

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

これは機能しますが、不必要なメモリ割り当てが必要になります。

Slick Solution として追加

より効率的なソリューションこのアプローチは、追加機能を利用することです。元の引数にプレフィックスとセパレータを追加することで、メモリの再割り当てを回避できます。

<code class="go">func Debug(a ...interface{}) {
    if debug {
        fmt.Fprintln(out, append([]interface{}{prefix, sep}, a...)...)
    }
}</code>

このワンライナーは、新しいスライスを作成せずに、プレフィックスとセパレータを可変個引数の先頭に効果的に追加します。これは簡潔かつ効率的で、可変個引数ラッパーの機能を損なうことなくメモリ割り当ての問題を解決します。

以上が可変引数ラッパー関数でのメモリの再割り当てを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。