Heim >Backend-Entwicklung >Golang >Konzentrieren Sie sich auf die Syntax und Verwendung von Golang-Methoden

Konzentrieren Sie sich auf die Syntax und Verwendung von Golang-Methoden

PHPz
PHPzOriginal
2023-03-30 13:35:251081Durchsuche

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!

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