効率的なスライス要素の削除
Go では、順序を維持しながらスライスから要素を削除するには、慎重なアプローチが必要です。一般的に使用される append(a[:i], a[i 1:]...) メソッドは、ループ変数を中断する可能性があるため、ループ内では非実用的になります。
反復アプローチ
範囲ループを使用する代わりに、スライスの先頭から開始する反復アプローチを検討してください。
<code class="go">for i := 0; i < len(a); i++ { if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) i-- // Decrement loop variable to skip shifted element } }
このアプローチでは、ループがすべての要素を正しく処理し、ループ変数をデクリメントします。
効率のための下向きループ
さらに効率的な方法は、スライスを逆の順序で走査することです。これにより、ループ変数を手動でデクリメントする必要がなくなります:
<code class="go">for i := len(a) - 1; i >= 0; i-- { if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) } }</code>
または、多数の削除が必要な場合は、削除不可能な要素を新しいスライスにコピーすることを検討してください:
<code class="go">b := make([]string, len(a)) copied := 0 for _, s := range(a) { if !conditionMeets(s) { b[copied] = s copied++ } } a = b[:copied]</code>
このアプローチメモリ割り当てとコピー操作を最小限に抑えます。
ゼロ化によるインプレース削除
汎用の削除の場合は、削除不可能な要素を前方にコピーするインプレース アプローチを検討してください。削除された要素をゼロにします:
<code class="go">copied := 0 for i := 0; i < len(a); i++ { if !conditionMeets(a[i]) { a[copied] = a[i] copied++ } } for i := copied; i < len(a); i++ { a[i] = "" // Zero places of removed elements } a = a[:copied]</code>
このアプローチは効率的で、GC が到達不能な値を再利用できるようにします。
以上が順序を維持しながら Go スライスから要素を効率的に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。