Methoden für Schnittstellenzeiger in Golang aufrufen
Bei der Arbeit mit der Gorp-Bibliothek für den Datenbankzugriff stoßen Entwickler häufig auf die Notwendigkeit, Methoden aufzurufen einen Schnittstellenzeiger unter Beibehaltung der Möglichkeit, Transaktionen rückgängig zu machen. Dieses Problem ergibt sich aus der Anforderung, die Gorp DbMap- oder Transaktionsinstanz als Feldeigenschaft zu übergeben.
Das Problem
Wie im Beispielcode gezeigt, wird versucht, Methoden aufzurufen auf der SqlExecutor-Schnittstelle unter Verwendung einer Zeigerreferenz führt zu einem undefinierten Methodenfehler. Dies liegt daran, dass der Typ *gorp.SqlExecutor keine Get-Methode hat, während die gorp.SqlExecutor-Schnittstelle selbst eine hat.
Die Lösung
Das zugrunde liegende Missverständnis liegt darin die Annahme, dass die Übergabe eines Zeigers auf einen Schnittstellenwert das gleiche Verhalten liefert wie ein Aufruf per Referenz in anderen Sprachen. In Go werden Zeiger auf Schnittstellen aus zwei spezifischen Gründen verwendet:
Keiner dieser Gründe gilt für Zeiger auf Schnittstellen, da Schnittstellenwerte bereits winzig sind und nicht über die Schnittstelle geändert werden können Wert selbst. Stattdessen ist es notwendig, den im Schnittstellenwert gespeicherten Wert zu ändern, der oft ein Zeiger auf eine tatsächliche Struktur ist.
Korrekte Implementierung
Um das Problem zu beheben, Der Code sollte die Übergabe eines Zeigers auf das Gorp-„Objekt“ vermeiden und stattdessen den Schnittstellenwert direkt übergeben. Der folgende Code implementiert diesen Ansatz korrekt:
package repositories import "github.com/coopernurse/gorp" type Repository struct { Gorp gorp.SqlExecutor // Pass the interface value directly } func (r Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) if err != nil { panic(err) } return obj }
Durch die Übergabe des Schnittstellenwerts als Wert und nicht als Referenz kann der Code die erforderliche Funktionalität beibehalten und gleichzeitig die ordnungsgemäße Verwendung von Zeigern in Go einhalten.
Das obige ist der detaillierte Inhalt vonWarum erhalte ich die Fehlermeldung „Undefinierte Methode', wenn ich Methoden auf einem Schnittstellenzeiger in Go aufrufe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!