Heim >Backend-Entwicklung >Golang >Wie rufe ich Methoden für Schnittstellenzeiger in Go korrekt auf?
Methoden auf Schnittstellenzeigern in Go aufrufen
In Go kann es beim Programmieren gegen Schnittstellen zu Situationen kommen, in denen Sie dazu in der Lage sein müssen Rufen Sie Methoden für einen Zeiger auf einen Schnittstellenwert auf. Dies kann in Fällen auftreten, in denen Sie auf zugrunde liegende Methoden zugreifen möchten, die nicht direkt von der Schnittstelle selbst verfügbar gemacht werden.
Stellen Sie sich das folgende Szenario vor:
package main import "fmt" // SqlExecutor interface type SqlExecutor interface { Get(i interface{}, key interface{}) (interface{}, error) } // GorpDbMap and GorpTransaction implement SqlExecutor type GorpDbMap struct{} type GorpTransaction struct{} func (db GorpDbMap) Get(i interface{}, key interface{}) (interface{}, error) { return nil, nil } func (tx GorpTransaction) Get(i interface{}, key interface{}) (interface{}, error) { return nil, nil } func main() { // Initialize a GorpDbMap or GorpTransaction dbMap := GorpDbMap{} transaction := GorpTransaction{} // Create a repository that uses the SqlExecutor interface repo := Repository{ // This will result in an error Gorp: &dbMap, } // Try to call Get method on the pointer to the SqlExecutor interface obj, err := repo.GetById(1, 2) if err != nil { fmt.Println(err) } fmt.Println(obj) } // Repository demonstrates calling methods on interface pointers type Repository struct { Gorp SqlExecutor } func (r Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) if err != nil { panic(err) } return obj }
Wenn Sie den obigen Code ausführen, werden Sie dies tun Es tritt der folgende Fehler auf:
r.Gorp.Get undefined (type *gorp.SqlExecutor has no field or method Get)
Dieser Fehler tritt auf, weil der Zeiger auf den SqlExecutor-Schnittstellenwert vor dem Aufruf von Get nicht ordnungsgemäß dereferenziert wird Methode.
Um dieses Problem zu beheben, müssen Sie den Zeiger auf den Schnittstellenwert mithilfe des Sternchenoperators (*) dereferenzieren. Dies kann erreicht werden, indem der Code wie folgt geändert wird:
func main() { // Initialize a GorpDbMap or GorpTransaction dbMap := GorpDbMap{} transaction := GorpTransaction{} // Create a repository that uses the SqlExecutor interface repo := Repository{ Gorp: &dbMap, } // Try to call Get method on the pointer to the SqlExecutor interface obj, err := (*repo.Gorp).Get(1, 2) if err != nil { fmt.Println(err) } fmt.Println(obj) }
Durch die Dereferenzierung des Zeigers auf den Schnittstellenwert können Sie nun auf die zugrunde liegenden Methoden der Struktur zugreifen, die die Schnittstelle implementiert. In diesem Fall wird die Get-Methode der GorpDbMap-Struktur erfolgreich aufgerufen.
Es ist wichtig zu beachten, dass in Go im Allgemeinen empfohlen wird, die Übergabe von Werten nach Wert der Übergabe von Zeigern auf Werte vorzuziehen. Dies hilft, unbeabsichtigte Änderungen der ursprünglichen Werte zu verhindern. Im Fall von Schnittstellen sollten Sie normalerweise den Schnittstellenwert selbst und nicht einen Zeiger auf den Schnittstellenwert übergeben.
Das obige ist der detaillierte Inhalt vonWie rufe ich Methoden für Schnittstellenzeiger in Go korrekt auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!