ループ内のスライス要素の削除
ループ内のスライスから要素を効果的に削除するのは難しい場合があります。間違っていますが一般的なアプローチは、範囲ベースのループ内で追加を使用することです:
<code class="go">for i := range a { // BAD if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) } }</code>
ただし、このアプローチでは、ループ変数が同期されなくなり、要素がスキップされます。
正しいループベースの削除
代わりに、要素を削除した後にループ変数を手動でデクリメントすることを検討してください:
<code class="go">for i := 0; i < len(a); i++ { if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) i-- } }
複数の削除のための下向きループ
複数の要素を削除する必要がある場合、下向きループにより、シフトされた要素がループの反復の外側に残るようにします:
<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++ } } b = b[:copied]</code>
サイクルを使用したインプレース削除
で実行するには- 削除を配置し、2 つのインデックスを維持し、削除不可能な要素を割り当てながら、削除された要素をゼロにします:
<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>
以上がGo のループ内のスライスから要素を削除する方法: ベスト プラクティスは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。