Go のループ内のスライスから要素を削除する方法: ベスト プラクティスは何ですか?

Mary-Kate Olsen
リリース: 2024-10-28 05:01:30
オリジナル
189 人が閲覧しました

How to Remove Elements from a Slice Within a Loop in Go: What Are the Best Practices?

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

ループ内のスライスから要素を効果的に削除するのは難しい場合があります。間違っていますが一般的なアプローチは、範囲ベースのループ内で追加を使用することです:

<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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!