Maison >développement back-end >Golang >modification de la carte de synchronisation Golang
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 :
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!