メモリ再割り当てを使用しない可変個引数ラッパー
可変個引数関数はパラメーター処理に柔軟性をもたらしますが、ラッパー関数に項目を追加するとメモリの再割り当てがトリガーされる可能性があります。この記事では、デバッグの利便性を維持しながらこの問題を回避するための解決策を検討します。
可変個引数ラッパーを作成する一般的なアプローチの 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 サイトの他の関連記事を参照してください。