Maison  >  Article  >  développement back-end  >  Pourquoi dois-je synchroniser l’accès aux variables de chaîne dans Go, même si les chaînes sont immuables ?

Pourquoi dois-je synchroniser l’accès aux variables de chaîne dans Go, même si les chaînes sont immuables ?

DDD
DDDoriginal
2024-11-03 06:52:02259parcourir

Why Do I Need to Synchronize Access to String Variables in Go, Even Though Strings Are Immutable?

Immuabilité des chaînes et synchronisation des threads

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!

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