スライスから要素を反復的に削除する
スライスを反復する場合、ループ内の要素を削除するのは、その後の要素。よくある間違ったアプローチは、以下の例に示すように、append を使用して要素を削除することです。
a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := range a { // BAD
if conditionMeets(a[i]) {
a = append(a[:i], a[i 1:]...)
}
}
ループではシフトされた要素が考慮されていないため、このメソッドは正しく機能しません。反復中に要素を適切に削除するには、下向きループを使用するか、定数コピー操作を回避する別の方法を採用できます。
下向きループ
下向きループは反復します。最後の要素から逆の順序で開始します。このアプローチにより、ループ変数を手動で減分することなく要素を削除できます:
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:]...)
}
}
多数の削除の代替方法
多数の要素を削除する必要がある場合、追加を使用するとコピーが過剰になるため非効率になる可能性があります。別のアプローチは、新しいスライスを作成し、削除できない要素のみをコピーすることです:
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]
多くの削除のためのインプレース削除 (汎用)
インプレース削除手法には、2 つのインデックスを維持し、非インデックスを割り当てることが含まれます。削除された要素の位置をゼロにしながら、同じスライス内の削除可能な要素:
a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
copied := 0
for i := 0; i
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3