Die Go-Spezifikation besagt, dass Strings unveränderlich sind, was bedeutet, dass ihr Inhalt nach der Erstellung nicht mehr geändert werden kann. Dies stellt einen offensichtlichen Widerspruch zum folgenden Codeausschnitt dar:
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
Wenn Zeichenfolgen unveränderlich sind, warum ändert sich dann durch Ändern des Werts des Zeigers, der str zugewiesen ist, auch der Wert von str?
Der Hauptunterschied besteht hier zwischen String-Werten und String-Variablen. str ist eine Variable vom Typ string. Wenn Sie den Zuweisungsoperator (=) für str verwenden, ändern Sie den Wert der str-Variablen, nicht den Wert der Zeichenfolge, auf die str verweist.
In Go werden Zeichenfolgenwerte durch das Reflect dargestellt. StringHeader-Struktur, die einen Zeiger auf die Daten und deren Länge enthält. Nach der Erstellung kann diese Struktur nicht mehr geändert werden.
Der &-Operator gibt die Adresse einer Variablen zurück, nicht den Wert der Variablen. Daher gibt &str die Adresse der str-Variablen zurück, nicht die Adresse des String-Werts, auf den str verweist.
Wenn Sie die ptr := &str-Anweisung verwenden, erstellen Sie einen Zeiger auf die str-Variable. Das Zuweisen eines neuen Werts zu *ptr ändert den Wert der str-Variablen, aber nicht den Wert der Zeichenfolge, auf die str verweist.
In Go sind Zeichenfolgenwerte unveränderlich . Allerdings können String-Variablen geändert werden, was indirekt den String-Wert ändern kann, auf den sich die Variable bezieht.
Das obige ist der detaillierte Inhalt vonWarum scheint das Ändern eines String-Zeigers einen unveränderlichen String in Go zu ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!