Golang verfügt als relativ junge Sprache auch über eine eigene, einzigartige Implementierungsmethode. Dieser Artikel konzentriert sich auf die Syntax und Verwendung von Golang-Methoden.
1. Methodendefinition
Methoden können für jeden Typ in Golang definiert werden, einschließlich Referenztypen und Nicht-Referenztypen. Das Methodendefinitionsformat ist wie folgt:
func (t Type) methodName(parameterList) (returnList){ //方法体 }
wobei t der Empfänger ist, Type den Empfängertyp darstellt, methodName der Methodenname ist, parameterList und returnList die Methodenparameter- bzw. Rückgabewertlisten darstellen.
Der Empfänger kann ein Werttyp oder ein Zeigertyp sein, der beim Definieren der Methode hinzugefügt werden muss, zum Beispiel:
func (p *Person) SetName(name string) { p.name = name }
2. Methodenaufruf
Der Methodenaufruf in Golang ähnelt dem Funktionsaufruf. außer dass es sein muss Geben Sie beim Anruf den entsprechenden Empfänger an. Zum Beispiel:
package main import "fmt" type Person struct { name string } func (p *Person) SetName(name string) { p.name = name } func (p Person) GetName() string { return p.name } func main() { p := Person{name: "张三"} fmt.Println(p.GetName()) // 输出:张三 p.SetName("李四") fmt.Println(p.GetName()) // 输出:李四 }
Im obigen Beispiel wird zunächst eine Struktur namens Person definiert, die ein Namensattribut vom Typ String enthält. Anschließend werden zwei Methoden definiert: SetName und GetName, mit denen der Wert des Namensattributs festgelegt bzw. abgerufen wird. In der Hauptfunktion wird zunächst eine Variable p vom Typ Person erstellt, ihre GetName-Methode aufgerufen und der Namensattributwert von p ist „Zhang San“. Dann wurde die SetName-Methode aufgerufen, um den Wert in „John Doe“ zu ändern, und dann wurde die GetName-Methode aufgerufen, um den geänderten Namensattributwert „John Doe“ auszugeben.
3. Wert- und Zeigerempfänger
Wie aus den vorherigen Codebeispielen hervorgeht, können Methoden für Werttypen oder Zeigertypen definiert werden.
Hinweis: Unterschiedliche Empfängertypen können einander nicht zugeordnet werden.
1. Wertempfänger
Wenn die Methode definiert ist und der Empfänger ein Werttyp ist, wird der Empfänger beim Aufruf der Methode einmal kopiert. Daher haben an der kopierten Instanz ausgeführte Vorgänge keine Auswirkungen auf die ursprüngliche Instanz. Zum Beispiel:
package main import "fmt" type Person struct { name string } func (p Person) GetName() string { return p.name } func (p Person) SetName(name string) { p.name = name } func main() { p1 := Person{name: "张三"} p2 := p1 p2.SetName("李四") fmt.Println(p1.GetName()) // 输出:张三 fmt.Println(p2.GetName()) // 输出:李四 }
Die vom Werttypempfänger definierte Methode Setname kopiert bei der Instanziierung den Originalwert, sodass p1 und p2 tatsächlich zwei verschiedene Instanzen sind. Wenn p2 also die SetName-Methode aufruft, um den Attributwert zu ändern, hat dies keine Auswirkung auf p1.
2. Zeigerempfänger
Wenn die Methode definiert ist und der Empfänger ein Zeigertyp ist, wird beim Aufruf der Methode tatsächlich das Objekt bedient, auf das der Zeiger zeigt. Wenn die Methode das Objekt ändert, wirkt sich dies direkt auf das Originalobjekt aus. Beispiel:
package main import "fmt" type Person struct { name string } func (p *Person) GetName() string { return p.name } func (p *Person) SetName(name string) { p.name = name } func main() { p1 := &Person{name: "张三"} p2 := p1 p2.SetName("李四") fmt.Println(p1.GetName()) // 输出:李四 fmt.Println(p2.GetName()) // 输出:李四 }
Die vom Zeigertypempfänger definierte Methode SetName ändert direkt den Attributwert des gezeigten Objekts, und p1 und p2 zeigen auf dasselbe Objekt. Wenn also einer von ihnen die SetName-Methode aufruft, um den Attributwert zu ändern , das andere Objekt Es ist auch einflussreich.
4. Struktureinbettungsmethode
Golang ermöglicht die Struktureinbettung, das heißt, eine Struktur kann Mitgliedsvariablen anderer Strukturtypen enthalten.
Beim Einbetten einer Struktur können Sie * oder & vor dem Typnamen hinzufügen, um den eingebetteten Zeigertyp oder Werttyp anzugeben. Zum Beispiel:
type Person struct { name string } func (p *Person) GetName() string { return p.name } type Employee struct { *Person age int } func main() { emp := &Employee{Person: &Person{"张三"}, age: 28} fmt.Println(emp.GetName()) // 输出:张三 }
In diesem Beispiel wird zunächst ein Person-Strukturtyp definiert, der ein Namensattribut vom Typ String und eine GetName-Methode enthält. Anschließend wird ein Strukturtyp „Employee“ definiert, der Strukturtyp „Persion“ eingebettet und ein Altersattribut vom Typ „Ganzzahl“ hinzugefügt. Verwenden Sie bei der endgültigen Instanziierung von emp die Initialisierungsmethode mit geschweiften Klammern, um ein Objekt dieses Typs für die Persion-Eigenschaft zu initialisieren. Beim Aufrufen der GetName-Methode von emp wird tatsächlich die GetName-Methode der Persion-Eigenschaft innerhalb von emp aufgerufen und somit „Zhang San“ ausgegeben.
5. Zusammenfassung
Methoden in Golang ähneln Funktionsmethoden, haben jedoch einen klareren Funktionsumfang. Die Attributwerte des Objekts können direkt über die vom Zeigertypempfänger definierte Methode geändert werden, wodurch die Flexibilität der Methode erhöht und die Mühe der Neuzuweisung des Werts über den Rückgabewert vermieden wird. Durch die Struktureinbettung kann redundanter Code vermieden werden, wodurch das Programm prägnanter wird.
Das obige ist der detaillierte Inhalt vonKonzentrieren Sie sich auf die Syntax und Verwendung von Golang-Methoden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!