可変個引数関数ラッパー: メモリの再割り当てを行わずに項目を追加する
可変個引数関数は、関数に任意の数の引数を渡す便利な方法を提供します。ただし、可変引数関数をラップする場合、項目を追加するとメモリ割り当てが発生する可能性があります。この記事では、このようなラッパーでの不必要なメモリ割り当てを回避するためのさまざまなアプローチを検討します。
非効率なアプローチ
省略記号 "..." 演算子を使用して可変長スライスを直接拡張しようとする(アプローチ 1) では、「引数が多すぎます」エラーまたは型の不一致の問題が発生する可能性があります (アプローチ2).
アプローチ 3 は、追加項目に対応するために新しいスライスを割り当てますが、頻繁なログ記録やデバッグ操作には非効率的になる可能性があります。
効率的なアプローチ
より効率的なアプローチには、追加関数を使用して、再割り当てを行わずにスライスを動的に拡張することが含まれます。 append 関数は、既存のスライスに追加項目が追加された新しいスライスを返します。
<code class="go">func Debug(a ...interface{}) { if debug { fmt.Fprintln(out, append([]interface{}{prefix, sep}, a...)...) } }</code>
このワンライナーは、元の可変長引数 (a) から作成されたスライスに接頭辞と区切り文字を追加し、結果のスライスを fmt.Fprintln にコピーします。このアプローチでは、append 関数を利用することで、可変引数関数のパラメーター要件を満たしながら、メモリの再割り当てを回避します。
以上がメモリを再割り当てせずに可変引数関数ラッパーに項目を追加するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。