Maison > développement back-end > Golang > modification de la carte de synchronisation Golang

modification de la carte de synchronisation Golang

WBOY
Libérer: 2023-05-10 09:30:06
original
791 Les gens l'ont consulté

J'ai récemment rencontré un problème sur le type sync.Map lors de l'utilisation du langage Go : comment modifier les données qu'il contient, notamment dans un environnement concurrent. Ici, je voudrais partager ma compréhension et ma solution.

Le type sync.Map en langage Go est une Map thread-safe qui peut être utilisée dans un environnement simultané. Son utilisation est très simple. Vous pouvez définir une variable sync.Map via le code suivant :

var m sync.Map
Copier après la connexion

Ensuite, vous pouvez lire et écrire des éléments via les méthodes Load et Store, par exemple : #🎜🎜 #.

m.Store("key1", "value1")
v, ok := m.Load("key1")
Copier après la connexion

Ce qu'il faut noter dans ce processus, c'est que le premier paramètre de la méthode Store est la clé, le deuxième paramètre est la valeur et la valeur de retour de la méthode Load en a deux, le premier est la valeur, la seconde est une valeur de type booléen utilisée pour indiquer si la clé est trouvée.

Mais que faire si on doit modifier un élément dans sync.Map ? La valeur ne peut pas être modifiée directement via l'indice comme le type de carte ordinaire. Jetons un coup d'œil à ce que dit la documentation officielle de Go à propos des modifications :

It must not be copied after first use.

To avoid ownership issues, values stored in the Map should not be modified. 
Copier après la connexion

La documentation indique que les valeurs dans sync.Map ne doivent pas être modifiées. En effet, map est un type de référence et si nous le modifions, cela peut affecter d'autres coroutines, provoquant des conditions de concurrence critique et des incohérences de données.

Donc, si nous voulons modifier une paire clé-valeur existante, que devons-nous faire ?

En fait, nous pouvons utiliser la méthode Range à l'intérieur du type sync.Map pour lire d'abord les éléments qui doivent être modifiés via cette méthode, puis réécrire une nouvelle valeur. L'exemple de code est le suivant :

m.Range(func(key, value interface{}) bool {
      if key == "key1" {
        m.Store(key, "newvalue")
    }
    return true
})
Copier après la connexion
Ici, nous parcourons d'abord l'intégralité de la carte via la méthode Range, puis déterminons si la clé qui doit être modifiée existe. Si elle existe, réécrivez une nouvelle valeur via la méthode Store. Il convient de noter que si la méthode Range renvoie false, l'opération de parcours s'arrêtera.

Enfin, nous devons résumer :

    La valeur du type sync.Map ne peut pas être modifiée. Si nous voulons mettre à jour une valeur, nous devons l'obtenir. via la méthode Range Cette valeur est ensuite réécrite avec une nouvelle valeur.
  1. Lorsque vous utilisez sync.Map, vous devez faire attention aux problèmes de traitement simultané pour éviter les incohérences des données et d'autres problèmes.
J'espère que cet article vous sera utile. S’il y a quelque chose d’inapproprié, lecteurs, donnez-moi quelques conseils !

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!

source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal