Maison >développement back-end >Golang >Pourquoi la modification d'un pointeur de chaîne semble-t-elle modifier une chaîne immuable dans Go ?

Pourquoi la modification d'un pointeur de chaîne semble-t-elle modifier une chaîne immuable dans Go ?

DDD
DDDoriginal
2024-12-15 00:23:15238parcourir

Why Does Changing a String Pointer Seem to Modify an Immutable String in Go?

Valeurs de chaîne immuables

La spécification Go indique que les chaînes sont immuables, ce qui signifie qu'une fois créées, leur contenu ne peut pas être modifié. Cela pose une contradiction apparente avec l'extrait de code suivant :

str := "hello"
fmt.Printf("%p\n",&str) // 0x1040c128
fmt.Printf("%v\n",str) // hello
ptr := &str
*ptr = "world"
fmt.Printf("%p\n",&str) // 0x1040c128
fmt.Printf("%v\n",str) // world  

Si les chaînes sont immuables, pourquoi la modification de la valeur du pointeur attribué à str modifie-t-elle également la valeur de str ?

Explication

La distinction clé ici est entre les valeurs de chaîne et les variables de chaîne. str est une variable de type chaîne. Lorsque vous utilisez l'opérateur d'affectation (=) sur str, vous modifiez la valeur de la variable str, et non la valeur de la chaîne à laquelle str fait référence.

Dans Go, les valeurs de chaîne sont représentées par le reflet. Structure StringHeader, qui contient un pointeur vers les données et leur longueur. Une fois créée, cette structure ne peut pas être modifiée.

L'opérateur & renvoie l'adresse d'une variable, pas la valeur de la variable. Par conséquent, &str renvoie l'adresse de la variable str, pas l'adresse de la valeur de chaîne à laquelle str fait référence.

Lorsque vous utilisez l'instruction ptr := &str, vous créez un pointeur vers la variable str. L'attribution d'une nouvelle valeur à *ptr modifie la valeur de la variable str, mais cela ne change pas la valeur de la chaîne à laquelle str fait référence.

Conclusion

Dans Go, les valeurs de chaîne sont immuables . Cependant, les variables de chaîne peuvent être modifiées, ce qui peut indirectement changer la valeur de chaîne à laquelle la variable fait référence.

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