Aufrufen von Methoden für Schnittstellenzeiger in Go
In Go müssen Sie möglicherweise für eine Schnittstelle programmieren und Transaktionen verwenden, ohne Ihre Schnittstelle zu ändern Code. Ein gängiger Ansatz besteht darin, einen Zeiger auf ein „Objekt“ in eine Feldeigenschaft zu übergeben, um bei Bedarf Rollbacks zu ermöglichen. Dieser Ansatz kann jedoch zu Verwirrung führen.
Betrachten wir ein Codebeispiel:
package repositories import ( "github.com/coopernurse/gorp" ) type Repository struct { Gorp *gorp.SqlExecutor // Pointer to SqlExecutor } func (r *Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) // Call method on pointer if err != nil { panic(err) } return obj }
Hier könnten Sie glauben, dass Sie einen Zeiger auf das Gorp-„Objekt“ benötigen, um Rollbacks durchzuführen. Es ist jedoch wichtig, einige Schlüsselkonzepte in Go zu verstehen:
Im Beispielcode können Sie, obwohl Sie einen Zeiger auf den Gorp SqlExecutor haben, keine Methoden auf dem Schnittstellenzeiger selbst aufrufen. Stattdessen rufen Sie Methoden für den zugrunde liegenden Wert auf. In diesem Fall ist der zugrunde liegende Wert eine SqlExecutor-Struktur.
Daher können Sie den Zeiger sicher aus der Repository-Struktur entfernen und einfach die SqlExecutor-Schnittstelle an das Repository übergeben:
package repositories import ( "github.com/coopernurse/gorp" ) type Repository struct { Gorp gorp.SqlExecutor // Pointer removed } func (r *Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) if err != nil { panic(err) } return obj }
Dies Der Code funktioniert wie erwartet und ermöglicht Ihnen die Verwendung von Transaktionen, ohne den zugrunde liegenden SqlExecutor zu ändern. Sie müssen sich in diesem Zusammenhang keine Gedanken über die Übergabe von Zeigern auf Schnittstellen machen.
Das obige ist der detaillierte Inhalt vonWarum sollte ich beim Aufrufen von Methoden in Go die Verwendung von Zeigern auf Schnittstellenwerte vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!