Heim > Backend-Entwicklung > Golang > Go-Zeiger: Warum scheint es, als könnte ich meiner Methode entweder einen Wert oder einen Zeiger übergeben?

Go-Zeiger: Warum scheint es, als könnte ich meiner Methode entweder einen Wert oder einen Zeiger übergeben?

Linda Hamilton
Freigeben: 2024-11-10 13:57:02
Original
776 Leute haben es durchsucht

 Go Pointers: Why Does It Seem Like I Can Pass Either a Value or a Pointer to My Method?

Go-Pointer: Zeigersemantik entmystifizieren

Pointer sind ein grundlegendes Konzept in der Go-Programmierung, das die Manipulation von Speicheradressen und -werten durch Referenz ermöglicht. Während Zeiger Ähnlichkeiten mit anderen Programmiersprachen aufweisen, kann die Zeigersemantik von Go einzigartig sein und bei Anfängern Verwirrung stiften.

Beachten Sie den folgenden Code:

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
    v := &Vertex{3, 4}
    fmt.Println(v.Abs())
}
Nach dem Login kopieren

Der Codeausschnitt definiert eine Vertex-Struktur und eine func (v *Vertex) Abs()-Methode, die den absoluten Wert der Scheitelpunktkoordinaten berechnet. Indem wir den Methodenempfänger als Zeiger *Vertex deklarieren, geben wir an, dass die Methode mit einem Zeiger auf einen Vertex-Wert arbeitet.

Wenn wir den Code wie folgt ändern:

func (v Vertex) Abs() float64 {
    [...]
    v := &Vertex{3, 4}
}
Nach dem Login kopieren

wo Ist der Empfänger kein Zeiger mehr, sondern ein Wert (Vertex), erhalten wir das gleiche Ergebnis. Dafür gibt es zwei Gründe:

Methodenableitung: Go ermöglicht die Ableitung einer Methode mit einem Zeigerempfänger von einer Methode mit einem Wertempfänger. Dies impliziert, dass die Methode func (v Vertex) Abs() automatisch eine zusätzliche Methodenimplementierung generiert:

func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X+v.Y*v.Y) }
func (v *Vertex) Abs() float64 { return Vertex.Abs(*v) } // GENERATED METHOD
Nach dem Login kopieren

Wenn Sie v.Abs() aufrufen, wobei v kein Zeiger ist, wird der Compiler dies automatisch finden und verwenden Sie die generierte Methode.

Automatische Adresserfassung: Go hat die Möglichkeit, die Adresse einer Variablen automatisch zu übernehmen. Im folgenden Code:

func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X+v.Y*v.Y) }
func main() {
    v := Vertex{3, 4}
    v.Abs()
}
Nach dem Login kopieren

der Ausdruck v.Abs() entspricht dem Code:

vp := &v
vp.Abs()
Nach dem Login kopieren

In diesem Szenario übernimmt der Compiler automatisch die Adresse der v-Variablen und übergibt es an die Zeigerempfängermethode func (v *Vertex) Abs().

Daher gilt bei den von Ihnen genannten Codeänderungen, unabhängig davon, ob Sie a übergeben Wenn Sie einen Wert oder einen Zeiger auf die Abs()-Methode verwenden, stellt die Zeigersemantik von Go das korrekte Verhalten sicher. Es gilt jedoch allgemein als bewährte Vorgehensweise, bei der Arbeit mit Referenztypen wie Strukturen in Go Zeiger zu verwenden.

Das obige ist der detaillierte Inhalt vonGo-Zeiger: Warum scheint es, als könnte ich meiner Methode entweder einen Wert oder einen Zeiger übergeben?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage