Go 言語では、要素の走査と削除は比較的一般的な要件です。ただし、Go 言語の特殊な機能により、いくつかの詳細に注意する必要があります。この記事では、Go言語で要素を走査・削除する際の注意点と、それを正しく実装する方法を紹介します。
Go 言語のスライスとマップのデータ構造は非常に使いやすいです。スライスは自動的に展開でき、マップはキー値に基づいて対応する値にすばやくアクセスできます。これらの機能により、Go 言語は大量のデータの処理に非常に適しています。ただし、スライスとマップを走査して要素を削除する場合は、次の問題に注意する必要があります。
スライス内の要素を削除するときは、次の点に注意する必要があります:
1) 実行します。トラバーサル中にスライスを変更しないでください
トラバーサル中にスライスを直接削除すると、インデックスが無効になり、誤って削除したり、削除し忘れたりする可能性があります。例:
func main() { nums := []int{1, 2, 3, 4, 5} for i, n := range nums { if n == 3 { nums = append(nums[:i], nums[i+1:]...) } } fmt.Println(nums) // 1 2 4 5 }
上記のコードが要素 3
に移動すると、要素は削除されます。ただし、要素を削除するときにスライスの長さとインデックスが変更されたため、後続の要素のインデックスが変更され、実際には 3
の最後の要素 4
だけが削除され、 3
自体は削除されていません。
この状況を回避するには、別のスライスを使用して削除する要素の添字を記録し、トラバース後に削除操作を実行します。例:
func main() { nums := []int{1, 2, 3, 4, 5} delIdx := []int{} for i, n := range nums { if n == 3 { delIdx = append(delIdx, i) } } for i, idx := range delIdx { nums = append(nums[:idx-i], nums[idx-i+1:]...) } fmt.Println(nums) // 1 2 4 5 }
上記のコードでは、削除する要素の添え字を記録するために、空のスライスdelIdx
が最初に定義されます。 nums
をトラバースするときに、削除する要素が見つかった場合は、その要素の添字が delIdx
に追加されます。走査が完了したら、nums
を削除します。
2) 「3 ポインター」を使用して削除を実装する
スライスを走査するときに要素を削除するもう 1 つの方法は、「3 ポインター」メソッドを使用することです。つまり、ポインタ i
はスライスを走査するために使用され、ポインタ j
は削除される要素の数を記録し、ポインタ k
は通常の要素を記録します。 。具体的な実装は次のとおりです。
func main() { nums := []int{1, 2, 3, 4, 5} j := 0 for i := range nums { if nums[i] != 3 { nums[j] = nums[i] j++ } } nums = nums[:j] fmt.Println(nums) // 1 2 4 5 }
上記のコードでは、まず、削除する要素の数を表すポインター j
を定義します。次に、ポインタ i
を使用してスライスを移動します。現在の要素を削除する必要がない場合は、それをポインタ k
の位置に移動し、## に 1 を加えます。 #k、正常を示す 要素数が 1 増加します。現在の要素を削除する必要がある場合は、スキップしてください。走査が完了したら、
nums[:j] を使用して余分な要素を削除します。
delete 関数を使用するだけです。例:
func main() { m := map[string]int{"a": 1, "b": 2, "c": 3, "d": 4} for k, v := range m { if v == 3 { delete(m, k) } } fmt.Println(m) // map[a:1 b:2 d:4] }
delete 関数を直接使用してください。
func main() { m := map[string]int{"a": 1, "b": 2, "c": 3, "d": 4} for k := range m { if k == "c" { m["e"] = 5 } fmt.Println(m[k]) } }
c を持つ要素に移動するとき、コードは新しいキーと値のペア
"e" をマップに追加します。 :5。マップの長さが変化するため、実行時パニックが発生します。
delete 関数を直接使用できます。ただし、マップの長さはトラバース中に変更できません。
以上がgolang traverseで要素を削除するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。