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.
- Traverser une tranche pour supprimer des éléments
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 }
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]
来删除多余的元素。
- 遍历map删除元素
在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. #🎜🎜#- #🎜🎜#Parcourir la carte pour supprimer des éléments#🎜🎜##🎜🎜##🎜🎜#Dans la carte de langue Go, l'opération de suppression d'éléments est très simple. Utilisez simplement la fonction
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

OpenSSL, en tant que bibliothèque open source largement utilisée dans les communications sécurisées, fournit des algorithmes de chiffrement, des clés et des fonctions de gestion des certificats. Cependant, il existe des vulnérabilités de sécurité connues dans sa version historique, dont certaines sont extrêmement nocives. Cet article se concentrera sur les vulnérabilités et les mesures de réponse communes pour OpenSSL dans Debian Systems. DebianopenSSL CONNUTS Vulnérabilités: OpenSSL a connu plusieurs vulnérabilités graves, telles que: la vulnérabilité des saignements cardiaques (CVE-2014-0160): cette vulnérabilité affecte OpenSSL 1.0.1 à 1.0.1F et 1.0.2 à 1.0.2 Versions bêta. Un attaquant peut utiliser cette vulnérabilité à des informations sensibles en lecture non autorisées sur le serveur, y compris les clés de chiffrement, etc.

L'article explique comment utiliser l'outil PPROF pour analyser les performances GO, notamment l'activation du profilage, la collecte de données et l'identification des goulots d'étranglement communs comme le processeur et les problèmes de mémoire. COMMANDE: 159

L'article traite des tests d'unité d'écriture dans GO, couvrant les meilleures pratiques, des techniques de moquerie et des outils pour une gestion efficace des tests.

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

Chemin d'apprentissage du backend: le parcours d'exploration du front-end à l'arrière-end en tant que débutant back-end qui se transforme du développement frontal, vous avez déjà la base de Nodejs, ...

L'article discute de la gestion des dépendances des modules GO via Go.mod, couvrant les spécifications, les mises à jour et la résolution des conflits. Il met l'accent sur les meilleures pratiques telles que le versioning sémantique et les mises à jour régulières.

L'article discute de l'utilisation de tests basés sur la table dans GO, une méthode qui utilise un tableau des cas de test pour tester les fonctions avec plusieurs entrées et résultats. Il met en évidence des avantages comme une amélioration de la lisibilité, une duplication réduite, l'évolutivité, la cohérence et un
