Aus dem Calls Abschnitt Go spec: https://golang.org/ref/spec#CallsGo Methodenaufruf Stenografie spec Anwendbarkeit
Ein Aufruf Methode
x.m()
gültig ist, wenn die Methode Satz (Art von)x
m
enthält und die Argumentliste kann der Parameterliste vonm
zugewiesen werden. Wennx
adressierbar und&x
‚s Methode Set enthältm
istx.m()
Abkürzung für(&x).m()
Mein Programm.
package main
import (
"fmt"
)
func main() {
p := Point{2, 3}
p.FakeScale(10)
fmt.Println(p)
p.RealScale(10)
fmt.Println(p)
}
type Point struct {
x int
y int
}
func (p Point) FakeScale(s int) {
p.x *= s
p.y *= s
}
func (p *Point) RealScale(s int) {
p.x *= s
p.y *= s
}
Hier ist der Ausgang.
{2, 3}
{20, 30}
Meine Frage bezieht sich speziell auf diesen Teil der Spezifikation.
Wenn
x
adressierbar ist und&x
‚s Methode Set enthältm
istx.m()
Abkürzung für(&x).m()
Meine Fragen.
- Ist der angegebene Teil auf
p.FakeScale(10)
anwendbar? Meine Schätzung ist "Nein", obwohl adressierbar ist, enthält&p
's Methodensatz nichtFakeScale
. Der Methodensatz enthältFakeScale
, da er den Wertempfänger verwendet, aber der Methodensatz enthält nichtFakeScale
, daher ist dieser Teil der Spezifikation nicht aufp.FakeScale(10)
anwendbar. Hab ich recht? - Ist der angegebene Teil auf
p.RealScale(10)
anwendbar? Meine Vermutung ist "Ja", weil adressierbar ist und&p
's Methodensatz enthältRealScale
aufgrund der Verwendung eines Zeigerempfängers. Daher ist dieser Teil der Spezifikation aufp.RealScale(10)
anwendbar. Hab ich recht? - Können Sie einen Beispielcode angeben, in dem
x.m()
gültig ist, aberx
nicht adressierbar ist und dieser Teil der Spezifikation daher nicht anwendbar ist?
Das habe ich in meiner dritten Frage nicht gefragt. Ich fragte, ob Sie ein Beispiel für 'x.m()' geben können, wobei 'x' nicht adressierbar ist. In meinem Code ist "p" unabhängig davon, ob "p.FakeScale()" aufgerufen wird oder "p.RealScale()" aufgerufen wird. –