Bien que les chaînes dans Go soient immuables, les variables contenant leurs références ne le sont pas. Par conséquent, lorsque vous travaillez avec des chaînes dans un environnement multithread, il est nécessaire de synchroniser l'accès à la variable de chaîne, et non à la chaîne elle-même.
Pourquoi les chaînes ne sont pas typées atomiquement
Un type atomique garantit que ses valeurs ne sont jamais modifiées après initialisation. Cependant, étant donné que les variables de chaîne peuvent être réaffectées, les chaînes ne sont pas typées de manière atomique.
Synchronisation des variables de chaîne
La synchronisation est requise chaque fois que plusieurs threads accèdent à une variable de chaîne, où à au moins un accès est une écriture. En effet, la valeur de la chaîne ne peut être modifiée qu'en réaffectant la variable, et non en modifiant la chaîne elle-même.
En pratique
Si vous avez une valeur de chaîne "bonjour ", il restera "bonjour" indéfiniment, en supposant que vous n'attribuez pas de nouvelle valeur à la variable. Cependant, si vous avez une valeur de tranche []byte{1, 2, 3}, ses éléments peuvent être modifiés simultanément, même si la tranche est passée par valeur.
Considérez l'exemple suivant :
var sig = make(chan int) func main() { s := []byte{1, 2, 3} go func() { <-sig s[0] = 100 sig <- 0 }() sliceTest(s) } func sliceTest(s []byte) { fmt.Println("First s =", s) sig <- 0 // send signal to modify now <-sig // Wait for modification to complete fmt.Println("Second s =", s) }
Sortie :
First s = [1 2 3] Second s = [100 2 3]
Dans cet exemple, sliceTest() reçoit une tranche et imprime sa valeur initiale. Il attend ensuite qu'un autre goroutine modifie la tranche, puis imprime sa valeur modifiée. Cela démontre que la valeur de tranche peut être modifiée simultanément. Cependant, si sliceTest() recevait un argument chaîne, cette modification n'aurait pas lieu.
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!