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 ?
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 ?
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.
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!