Heim >Backend-Entwicklung >Golang >Können Zeigermethoden in Go für Nicht-Zeigerwerte aufgerufen werden?
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!