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

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

Patricia Arquette
Patricia ArquetteOriginal
2024-12-19 22:24:13550Durchsuche

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

Zeigermethoden für Nicht-Zeigertypen

In der Antwort auf eine vorherige Frage heißt es, dass Zeigermethoden nur für Zeiger aufgerufen werden können. Dies scheint jedoch falsch zu sein, wie der folgende Code zeigt, der erfolgreich eine Zeigermethode für einen Nicht-Zeigerwert aufruft:

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()
    fmt.Println("Wheels:", c.wheels)
}

Erklärung

The Der Schlüssel zum Verständnis dieses Verhaltens liegt in der Tatsache, dass der Methodenempfänger ein Zeiger ist. Wenn Sie c.fourWheels() aufrufen, ist der Empfängerwert c ein Nichtzeiger. Da der Empfängertyp jedoch ein Zeiger ist, wird dies als Abkürzung für (&c).fourWheels() interpretiert.

Gemäß der Go-Spezifikation gilt beim Aufruf einer Methode, ob der Empfängerwert adressierbar ist und der Da der Empfängertyp ein Zeiger ist, wird der Methodenaufruf als Zeigermethodenaufruf interpretiert. In unserem Fall ist der Empfängerwert c adressierbar und der Empfängertyp *car ist ein Zeiger, sodass der Methodenaufruf c.fourWheels() effektiv (&c).fourWheels() aufruft.

Dieses Verhalten ist im Einklang mit der Aussage, dass Wertmethoden für Zeiger und Werte aufgerufen werden können, während Zeigermethoden nur für Zeiger aufgerufen werden können. Wenn bei Zeigermethoden der Empfängerwert kein Zeiger ist, muss er dereferenziert werden, um einen Zeigerwert zu erhalten, der als Empfänger verwendet werden kann.

Das obige ist der detaillierte Inhalt vonKö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