Heim >Backend-Entwicklung >Golang >Warum kann ich in Go nicht die Adresse eines String-Literals übernehmen?

Warum kann ich in Go nicht die Adresse eines String-Literals übernehmen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-10 01:00:11328Durchsuche

Why Can't I Take the Address of a String Literal in Go?

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!

Stellungnahme:
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