Heim >Backend-Entwicklung >Golang >Warum können Zeigermethoden in Go für Nicht-Zeigerwerte aufgerufen werden?

Warum können Zeigermethoden in Go für Nicht-Zeigerwerte aufgerufen werden?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-27 11:49:11808Durchsuche

Why Can Pointer Methods Be Called on Non-Pointer Values in Go?

Zeigermethoden für Nicht-Zeigertypen erklärt

In Go besagt die Konvention, dass Wertmethoden sowohl für Zeiger als auch für Werte aufgerufen werden können. während Zeigermethoden auf Zeiger beschränkt sind. Eine offensichtliche Ausnahme von dieser Regel ist jedoch die Möglichkeit, Zeigermethoden auf Nicht-Zeigerwerte auszuführen.

Bedenken Sie den folgenden Codeausschnitt:

package main

import "fmt"

type car struct {
    wheels int
}

func (c *car) fourWheels() {
    c.wheels = 4
}

func main() {

    var c = car{}
    fmt.Println("Wheels:", c.wheels)
    c.fourWheels()
    // Here, a pointer method is invoked on a non-pointer value
    fmt.Println("Wheels:", c.wheels)
}

Der Code führt die Zeigermethode fourWheels erfolgreich aus auf dem Nicht-Zeigerwert c. Dies scheint im Widerspruch zur etablierten Regel zu stehen.

In Wirklichkeit verwenden Sie beim Aufruf der fourWheels-Methode für den Nicht-Zeigerwert c eine Kurzschreibweise. Der Ausdruck c.fourWheels() entspricht (&c).fourWheels().

In der Go-Spezifikation heißt es: „Wenn x adressierbar ist und der Methodensatz von &x m enthält, ist x.m() eine Abkürzung für ( &x).m()."

Mit anderen Worten: Go dereferenziert implizit den Nicht-Zeigerwert c, um einen Zeiger darauf zu erhalten, der dann als Empfänger verwendet wird für die Zeigermethode.

Um die Regel über Zeigermethoden zu verdeutlichen, sollte sie wie folgt interpretiert werden:

  • Wertmethoden können sowohl für Werte als auch für Zeiger aufgerufen werden.
  • Zeigermethoden können auf Zeiger und in bestimmten Fällen auf Nicht-Zeigerwerte aufgerufen werden, jedoch nur, wenn auf den Nicht-Zeigerwert indirekt über a zugegriffen werden kann Zeiger.

Das obige ist der detaillierte Inhalt vonWarum können Zeigermethoden in Go für Nicht-Zeigerwerte aufgerufen werden?. 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