Maison développement back-end Golang golang traverse pour supprimer des éléments

golang traverse pour supprimer des éléments

May 13, 2023 am 10:03 AM

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.

  1. 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
}
Copier après la connexion

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
}
Copier après la connexion

在上述代码中,首先定义了一个空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
}
Copier après la connexion

在上述代码中,首先定义一个指针j表示要删除的元素的数量。然后使用指针i遍历slice,如果当前元素不需要删除,则将其移动到指针k所在的位置,然后k加1,表示正常的元素数量增加了1。如果当前元素需要删除,则跳过即可。在遍历结束后,使用nums[:j]来删除多余的元素。

  1. 遍历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]
}
Copier après la connexion

在遍历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])
    }
}
Copier après la connexion

在遍历到键为c的元素时,代码向map中添加了一个新的键值对"e":5。由于map的长度改变了,会导致运行时panic。

综上所述,Go语言中遍历删除元素需要注意的地方有:

1)在遍历slice删除元素时,不要直接对slice进行删除操作,应该使用另一个slice来记录要删除的元素下标,遍历完后再进行删除操作;或者使用“三指针”实现删除。

2)在遍历map删除元素时,可以直接使用deleteAfin 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 :

rrreee

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.

#🎜🎜#2) Utilisez "trois pointeurs" pour implémenter la suppression #🎜🎜##🎜🎜# Une autre façon de supprimer des éléments lors du parcours d'une tranche consiste à utiliser la méthode "trois pointeurs". Autrement dit, un pointeur 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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Quelles sont les vulnérabilités de Debian OpenSSL Quelles sont les vulnérabilités de Debian OpenSSL Apr 02, 2025 am 07:30 AM

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.

Comment utilisez-vous l'outil PPROF pour analyser les performances GO? Comment utilisez-vous l'outil PPROF pour analyser les performances GO? Mar 21, 2025 pm 06:37 PM

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

Comment rédigez-vous des tests unitaires en Go? Comment rédigez-vous des tests unitaires en Go? Mar 21, 2025 pm 06:34 PM

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.

Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Apr 02, 2025 pm 02:06 PM

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 ...

Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Apr 02, 2025 pm 02:09 PM

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. � ...

Transformant du développement frontal au développement back-end, est-il plus prometteur d'apprendre Java ou Golang? Transformant du développement frontal au développement back-end, est-il plus prometteur d'apprendre Java ou Golang? Apr 02, 2025 am 09:12 AM

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, ...

Comment spécifiez-vous les dépendances dans votre fichier go.mod? Comment spécifiez-vous les dépendances dans votre fichier go.mod? Mar 27, 2025 pm 07:14 PM

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.

Comment utilisez-vous des tests basés sur la table dans GO? Comment utilisez-vous des tests basés sur la table dans GO? Mar 21, 2025 pm 06:35 PM

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

See all articles