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

modification de la carte de synchronisation Golang

WBOY
WBOYoriginal
2023-05-10 09:30:06786parcourir

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

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")

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. 

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
})

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!

Déclaration:
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
Article précédent:liste golang en jsonArticle suivant:liste golang en json