Maison > Article > développement back-end > golang traverse pour supprimer des éléments
Dans le langage Go, parcourir et supprimer des éléments est une exigence relativement courante. Cependant, en raison des particularités du langage Go, certains détails doivent être pris en compte. Cet article présentera ce à quoi vous devez faire attention lors du parcours et de la suppression d'éléments dans le langage Go, et comment l'implémenter correctement.
Les structures de données slice et map du langage Go sont très pratiques à utiliser. Les tranches peuvent se développer automatiquement et les cartes peuvent accéder rapidement aux valeurs correspondantes en fonction des valeurs clés. Ces fonctionnalités rendent le langage Go très adapté au traitement de grandes quantités de données. Cependant, lorsque vous parcourez des tranches et des cartes et supprimez des éléments, vous devez faire attention aux problèmes suivants.
Lors de la suppression d'éléments dans une tranche, vous devez faire attention aux points suivants :
# 🎜🎜# 1) Ne modifiez pas la tranche pendant le parcours La suppression directe de la tranche pendant le parcours entraînera l'invalidité de l'index, entraînant une suppression accidentelle ou une suppression manquée. Par exemple :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 }Lorsque le code ci-dessus passe à l'élément
3
, il sera supprimé. Cependant, comme la longueur et l'index de la tranche ont été modifiés lors de la suppression de l'élément, l'index des éléments suivants a changé. En fait, seul l'élément 4
après 3
a été supprimé. , et 3
lui-même n'a pas été supprimé. 3
这个元素时,会将其删除。但是,由于在删除元素时修改了slice的长度和索引,导致后面的元素索引发生了变化,实际上只删掉了3
的后一个元素4
,而3
本身并未被删掉。
为了避免这种情况,可以使用另一个slice来记录要删除的元素的下标,遍历完后再进行删除操作。例如:
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 }
在上述代码中,首先定义了一个空slicedelIdx
,用于记录要删除的元素的下标。在遍历nums
时,如果找到要删除的元素,则把该元素的下标加入到delIdx
中。在遍历完毕后,再对nums
进行删除操作。
2)使用“三指针”实现删除
另一种在遍历slice时删除元素的方法是采用“三指针”的方式。即使用一个指针i
遍历slice,一个指针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
遍历slice,如果当前元素不需要删除,则将其移动到指针k
所在的位置,然后k
加1,表示正常的元素数量增加了1。如果当前元素需要删除,则跳过即可。在遍历结束后,使用nums[:j]
来删除多余的元素。
在Go语言的map中,删除元素的操作非常简单。只需要使用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] }
在遍历map时删除元素,不会出现索引失效的情况。因为map是无序的,每个元素的位置并不重要。因此,直接在遍历时使用delete
函数即可。
需要注意的是,在遍历map时不能修改map的长度。例如下面这段代码会导致panic:
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
的元素时,代码向map中添加了一个新的键值对"e":5
。由于map的长度改变了,会导致运行时panic。
综上所述,Go语言中遍历删除元素需要注意的地方有:
1)在遍历slice删除元素时,不要直接对slice进行删除操作,应该使用另一个slice来记录要删除的元素下标,遍历完后再进行删除操作;或者使用“三指针”实现删除。
2)在遍历map删除元素时,可以直接使用delete
Afin d'éviter cette situation, vous pouvez utiliser une autre tranche pour enregistrer l'indice de l'élément à supprimer, puis effectuer l'opération de suppression après le parcours. Par exemple :
Dans le code ci-dessus, une tranche videdelIdx
est d'abord définie pour enregistrer l'indice de l'élément à supprimer. Lors du parcours de nums
, si l'élément à supprimer est trouvé, l'indice de l'élément est ajouté à delIdx
. Une fois le parcours terminé, supprimez les nums
.
i
est utilisé pour parcourir la tranche, un pointeur j
enregistre le nombre d'éléments à supprimer et un pointeur k
enregistre les éléments normaux. L'implémentation spécifique est la suivante : #🎜🎜#rrreee#🎜🎜#Dans le code ci-dessus, définissez d'abord un pointeur j
pour représenter le nombre d'éléments à supprimer. Utilisez ensuite le pointeur i
pour parcourir la tranche. Si l'élément actuel n'a pas besoin d'être supprimé, déplacez-le à l'emplacement du pointeur k
, puis ajoutez 1 à. k
, indiquant que le nombre normal d'éléments a augmenté de 1. Si l'élément actuel doit être supprimé, ignorez-le. Une fois le parcours terminé, utilisez nums[:j]
pour supprimer les éléments en excès. #🎜🎜#delete
. Par exemple : #🎜🎜#rrreee#🎜🎜#La suppression d'éléments lors de la traversée de la carte n'entraînera pas d'échec de l'index. La carte n’étant pas ordonnée, la position de chaque élément n’a pas d’importance. Par conséquent, utilisez simplement la fonction delete
directement pendant le parcours. #🎜🎜##🎜🎜#Il est à noter que la longueur de la carte ne peut pas être modifiée lors du parcours de la carte. Par exemple, le code suivant provoquera la panique : #🎜🎜#rrreee#🎜🎜#Lors du passage vers l'élément avec la clé c
, le code ajoute une nouvelle paire clé-valeur au carte "e":5
. Étant donné que la longueur de la carte change, cela provoquera une panique à l'exécution. #🎜🎜##🎜🎜#Pour résumer, ce à quoi vous devez faire attention lors du parcours et de la suppression d'éléments en langage Go sont : #🎜🎜##🎜🎜#1) Lorsque vous parcourez une tranche pour supprimer des éléments, ne supprimez pas directement la tranche. Vous devez utiliser une autre tranche pour enregistrer l'indice de l'élément à supprimer, puis effectuer l'opération de suppression après le parcours ou utiliser « trois pointeurs » pour implémenter la suppression. #🎜🎜##🎜🎜#2) Lorsque vous parcourez la carte pour supprimer des éléments, vous pouvez directement utiliser la fonction delete
sans échec d'index. Mais la longueur de la carte ne peut pas être modifiée lors du parcours. #🎜🎜##🎜🎜#Après avoir maîtrisé les compétences ci-dessus, nous pouvons correctement mettre en œuvre l'opération de parcours et de suppression d'éléments en langage Go. #🎜🎜#Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!