Le concept d'accès simultané aux cartes à l'aide du mot-clé plage dans Go est souvent mal compris. Pour clarifier cette question, explorons les subtilités de l'accès simultané aux cartes et les implications de l'utilisation de range.
L'expression de plage dans une instruction for n'est évaluée qu'une seule fois avant la boucle. commence, hors certains scénarios spécifiques. Dans le cas d'une carte, l'expression range pointe simplement vers la variable map.
Lors de l'itération avec range, les variables clé et valeur (k et v dans la plupart des cas) conserver les valeurs de la carte lors de chaque itération. Cependant, l'accès à la carte ne se produit pas dans le bloc for lors de l'exécution d'une itération. Cela se produit lorsque les valeurs k et v sont définies pour l'itération suivante.
Comprenant ces concepts, il est sûr d'effectuer une itération simultanée sur une carte en utilisant un verrou pour protéger la carte lors de l’itération. Cependant, le déverrouillage au cours de l'itération doit être effectué sous forme d'instruction différée pour gérer les retours anticipés.
var testMap = make(map[int]int) var testMapLock = &sync.RWMutex{} func IterateMapKeys(iteratorChannel chan int) error { testMapLock.RLock() defer testMapLock.RUnlock() for k, v := range testMap { testMapLock.RUnlock() someFunc() testMapLock.RLock() if someCond { return someErr } } return nil }
Il est crucial de noter que ce type de schéma de verrouillage ne protège que contre les accès simultanés. . Cela n'empêche pas les modifications simultanées par d'autres goroutines. Cependant, si les modifications sont protégées par des verrous en écriture, elles restent sûres, mais la boucle for ne parcourra pas nécessairement la nouvelle paire.
Déverrouillage du verrou en lecture dans le bloc for n'est pas sûr, car il permet à d'autres goroutines de modifier la carte et potentiellement de provoquer une condition de concurrence.
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!