スライスから要素を反復的に削除する
スライスを反復する場合、ループ内の要素を削除するのは、その後の要素。よくある間違ったアプローチは、以下の例に示すように、追加を使用して要素を削除することです。
<code class="go">a := []string{"abc", "bbc", "aaa", "aoi", "ccc"} for i := range a { // BAD if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) } }</code>
ループがシフトされた要素を考慮していないため、このメソッドは正しく機能しません。反復中に要素を適切に削除するには、下向きループを使用するか、定数コピー操作を回避する代替方法を採用できます。
下向きループ
下向きループは反復します。最後の要素から逆の順序で開始します。このアプローチにより、手動でループ変数を減分することなく要素を削除できます。
<code class="go">a := []string{"abc", "bbc", "aaa", "aoi", "ccc"} for i := len(a) - 1; i >= 0; i-- { if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) } }</code>
多数の削除の代替方法
多数の要素を削除する必要がある場合要素の追加を使用すると、コピーが過剰になるため非効率になる可能性があります。別のアプローチは、新しいスライスを作成し、削除不可能な要素のみをコピーすることです。
<code class="go">a := []string{"abc", "bbc", "aaa", "aoi", "ccc"} 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">a := []string{"abc", "bbc", "aaa", "aoi", "ccc"} 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 for garbage collection } a = a[:copied]</code>
以上がGoでスライスから要素を繰り返し削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。