ホームページ  >  記事  >  バックエンド開発  >  Go で反復中にスライスから要素を安全に削除するにはどうすればよいですか?

Go で反復中にスライスから要素を安全に削除するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-27 17:38:02632ブラウズ

How to Safely Remove Elements from a Slice While Iterating in Go?

ループ内のスライスからの要素の削除

範囲ループを使用してスライスを反復中にスライスから要素を削除することは、次の理由により不可能です。スライスが内部で動作する方法。ただし、これを実現する別の方法もあります。

手動ループの使用とインデックスのデクリメント

1 つの方法は、len() 関数で手動ループを使用することです。スライスの長さを追跡します。要素が削除されると、次の要素がスキップされないようにインデックスをデクリメントする必要があります。例:

for i := 0; i < len(a); i++ {
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i+1:]...)
        i--
    }
}

下向きループの使用

より良い代替案は、手動インデックス調整の必要性を避けるために下向きループを使用することです:

for i := len(a) - 1; i >= 0; i-- {
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i+1:]...)
    }
}

削除不可能な要素のコピー

多くの要素を削除する必要があるシナリオでは、削除不可能な要素を新しいスライスにコピーする方が効率的である可能性があります:

b := make([]string, len(a))
copied := 0
for _, s := range(a) {
    if !conditionMeets(s) {
        b[copied] = s
        copied++
    }
}
b = b[:copied]

インプレース削除

インプレース削除手法は 2 つのインデックスを維持し、同じスライス内の削除不可能な要素を割り当てます:

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]

適切な方法を使用すると、削除による要素の移動に関連するエラーが発生することなく、ループ内のスライスから要素を効果的に削除できます。

以上がGo で反復中にスライスから要素を安全に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。