Heim > Backend-Entwicklung > Golang > Warum scheint das Ändern eines String-Zeigers einen unveränderlichen String in Go zu ändern?

Warum scheint das Ändern eines String-Zeigers einen unveränderlichen String in Go zu ändern?

DDD
Freigeben: 2024-12-15 00:23:15
Original
238 Leute haben es durchsucht

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

Unveränderliche String-Werte

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  
Nach dem Login kopieren

Wenn Zeichenfolgen unveränderlich sind, warum ändert sich dann durch Ändern des Werts des Zeigers, der str zugewiesen ist, auch der Wert von str?

Erklärung

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.

Fazit

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage