2016-03-22 6 views

Antwort

7

Da es keine implizite Bezeichner ist, den eigentlichen Empfänger Wert angibt (wie this in Java) und wenn Sie auf die Felder oder Methoden des Empfängers Wert (Rectangle Wert) beziehen möchten, müssen Sie eine Kennung, die Sie Kann benutzen.

Beachten Sie, dass die Spezifikation nicht erfordert, dass Sie den Empfängerwert, z. folgende die blank identifier verwendet, ist eine gültige Syntax:

func (_ Rectangle) Foo() string { 
    return "foo" 
} 

oder sogar unter: den Namen des Empfängers (der Parametername) Weglassen:

func (Rectangle) Foo() string { 
    return "foo" 
} 

entsprechender Abschnitt aus der spec: Method declarations:

MethodDecl = "func" Receiver MethodName (Function | Signature) . 
Receiver  = Parameters . 

Wo Parameter ist:

Parameters  = "(" [ ParameterList [ "," ] ] ")" . 
ParameterList = ParameterDecl { "," ParameterDecl } . 
ParameterDecl = [ IdentifierList ] [ "..." ] Type . 

Wie Sie in der letzten Zeile sehen können, die IdentifierList ist optional (aber Type ist erforderlich).

1

Struct-Methoden sind wie Klassenmethoden. Die Variable 'r' ist eine Referenz auf die struct/class-Instanz/das Objekt, auf die die Methode angewendet wird. Ohne diese Referenz können Sie nicht auf das zugreifen, was in dieser Struktur/diesem Objekt enthalten ist.

Hier können zum Beispiel sagen: Ich habe smallRectangle Ihre Struktur mit:

var smallRectangle = Rectangle{5,3} 

Jetzt möchte ich den Bereich mit dem Rechteck-Methode Area

area := smallRectangle.Area() 

Lets betrachten berechnen, was in der Funktion geschieht . r aus der Methodendeklaration wird eine Kopie von smallRectangle, da dies das struct-Objekt ist, das es aufruft.

func (smallRectangle Rectangle) Area() int { 
    return smallRectangle.length * smallRectangle.width 
} 

Wie durch Icza angegeben ist, gibt es keine implizite Kennung wie self oder this, so dass der einzige Weg für das Verfahren der Werte der struct zuzugreifen ist, durch die Kennung r.

Verwandte Themen