Heim >Backend-Entwicklung >Golang >Wie verhalten sich Schnittstellenzeiger beim Aufrufen von Methoden in Go?

Wie verhalten sich Schnittstellenzeiger beim Aufrufen von Methoden in Go?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-11 07:12:10279Durchsuche

How Do Interface Pointers Behave When Calling Methods in Go?

Aufrufen von Methoden für Schnittstellenzeiger in Go

Wenn Sie mit der Gorp-Bibliothek arbeiten, die die SqlExecutor-Schnittstelle implementiert, könnten beim Versuch Probleme auftreten um Methoden für Zeiger auf Schnittstellenwerte aufzurufen. Diese Verwirrung entsteht, weil Go nicht strikt dem Konzept des „Call-by-Reference“ folgt.

In Go werden Schnittstellen verwendet, um eine Gruppe von Objekten darzustellen, die gemeinsame Methoden haben. Wenn Sie einer Schnittstelle einen Wert zuweisen, speichern Sie eigentlich keinen Verweis auf dieses Objekt, sondern einen Zeiger auf den Wert des Objekts. Das heißt, wenn Sie eine Methode für einen Schnittstellenwert aufrufen, rufen Sie sie tatsächlich für das zugrunde liegende Objekt auf.

Betrachten Sie dieses Beispiel:

package main

import (
    "fmt"
)

type Person struct {
    Name string
}

func (p *Person) Greet() {
    fmt.Println("Hello, my name is", p.Name)
}

func main() {
    // Create a person object
    p := Person{Name: "John"}

    // Create an interface value that points to the person object
    var person interface{} = p

    // Call the Greet method on the interface value
    person.Greet() // Output: Hello, my name is John
}

In diesem Beispiel erstellen wir eine Personenobjekt und weisen Sie es dem Personenschnittstellenwert zu. Wenn wir dann die Greet-Methode für den Personenschnittstellenwert aufrufen, wird die Greet-Methode korrekt für das zugrunde liegende Person-Objekt aufgerufen. Dies liegt daran, dass der Schnittstellenwert tatsächlich auf das Person-Objekt zeigt.

Bei Zeigern auf Schnittstellenwerte kann es etwas verwirrender sein. In Go ist es im Allgemeinen nicht notwendig, Zeiger auf Schnittstellenwerte zu verwenden. Das einzige Szenario, in dem dies erforderlich sein könnte, ist, wenn Sie den Schnittstellenwert selbst ändern müssen. Wenn Sie beispielsweise das Objekt ändern möchten, auf das der Schnittstellenwert zeigt, müssen Sie einen Zeiger auf den Schnittstellenwert verwenden.

Hier ist ein Beispiel:

package main

import (
    "fmt"
)

type Person struct {
    Name string
}

func (p *Person) Greet() {
    fmt.Println("Hello, my name is", p.Name)
}

func main() {
    // Create a person object
    p := Person{Name: "John"}

    // Create a pointer to the person object
    pPtr := &p

    // Create an interface value that points to the person object
    var person interface{} = pPtr

    // Change the object that the interface value is pointing to
    person = &Person{Name: "Jane"}

    // Call the Greet method on the interface value
    person.Greet() // Output: Hello, my name is Jane
}

In In diesem Beispiel erstellen wir einen Zeiger auf das Person-Objekt und weisen ihn dem Schnittstellenwert „person“ zu. Wenn wir dann das Objekt ändern, auf das der Personenschnittstellenwert zeigt, wird die Greet-Methode für das neue Objekt aufgerufen. Dies liegt daran, dass wir den Schnittstellenwert selbst ändern, nicht das zugrunde liegende Objekt.

Im Allgemeinen sollten Sie in Ihrem Go-Code keine Zeiger auf Schnittstellenwerte verwenden müssen. Wenn Sie sie jedoch verwenden müssen, ist es wichtig zu bedenken, dass sie sich anders verhalten als Zeiger auf reguläre Werte.

Das obige ist der detaillierte Inhalt vonWie verhalten sich Schnittstellenzeiger beim Aufrufen von Methoden in Go?. 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