Heim >Backend-Entwicklung >Golang >Warum kann ich in Go nicht die Adresse eines String-Literals übernehmen?
Referenz auf String-Literale in Go
Die Verwendung von String-Referenzen in Go bietet Leistungsvorteile, da die Speicherzuweisung bei jedem Aufruf vermieden wird. Allerdings wirft das direkte Erhalten einer Referenz auf ein String-Literal, wie in test1() im Beispiel unten versucht, ein Problem auf.
var konnichiwa = `こんにちは世界` // Gives the compile error `cannot take the address of "Hello world"` func test1() (*string) { return &`Hello world` }
Warum ist das nicht möglich?
Die Übernahme der Adresse eines String-Literals ist aufgrund der mehrdeutigen Semantik verboten. Diese Unklarheit dreht sich darum, ob sich der Verweis auf die Konstante selbst oder auf eine Kopie der Konstante bezieht. Die Übernahme der Adresse der Konstante könnte möglicherweise zu Laufzeitfehlern führen, da ihr Wert geändert werden kann.
Beste Lösung
Die effektivste Lösung, wie in test2() gezeigt, beinhaltet die Verwendung eines Zeigers auf eine vorhandene Variable anstelle eines String-Literals. Dieser Ansatz ist ausführlicher, entspricht jedoch der Syntax von Go und gewährleistet eine klare Semantik.
// Works fine func test2() (*string) { hej := `Hej världen` return &hej }
Ausnahme: Zusammengesetzte Literale
Die Sprachspezifikation macht eine Ausnahme für zusammengesetzte Literale. wie in test3() gezeigt. Dies ermöglicht die Erstellung einer anonymen Struktur und den anschließenden Abruf ihrer Adresse.
func test3() (*string) { return &struct { A int B int }{1, 2} }
Obwohl diese Ausnahme besteht, bleibt der empfohlene Ansatz für die Handhabung von Verweisen auf statische Zeichenfolgen test2(), da er Einfachheit und Klarheit beibehält .
Das obige ist der detaillierte Inhalt vonWarum kann ich in Go nicht die Adresse eines String-Literals übernehmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!