Heim > Artikel > Backend-Entwicklung > Warum schlägt die Typzusicherung fehl, wenn die Schnittstellen „Valuer“ und „Scanner“ in Go implementiert werden?
Golang-Typzusicherungen verstehen
In Go kann man mithilfe von Typaliasen benutzerdefinierte Typen basierend auf vorhandenen Typen definieren. Im gegebenen Szenario ist der Role-Typ ein Alias für den integrierten String-Typ. Bei der Implementierung der Valuer- und Scanner-Schnittstellen für diesen benutzerdefinierten Typ tritt jedoch ein Fehler auf.
Behebung des Fehlers
Die Fehlermeldung deutet darauf hin, dass ein Problem mit vorliegt die Typkonvertierung in der Scan-Methode. Insbesondere wird der Versuch beanstandet, den konvertierten Wert einem Zeiger auf eine Rolle zuzuweisen.
Die erste Funktion, Scan, ist dafür verantwortlich, einen Wert aus der Datenbank zu extrahieren und ihn in den entsprechenden Typ zu konvertieren. Das Problem liegt in der Zuweisungszeile:
r = (*Role)(value.(string))
Der Ausdruck value.(string) versucht, den Wertparameter in einen String umzuwandeln. Die Zuweisung versucht jedoch, diesen konvertierten Wert anschließend einem Zeiger auf eine Rolle zuzuweisen. Dies ist falsch, da das Ziel vom Typ *Role und nicht vom Typ Role sein sollte. Der korrigierte Code lautet:
func (r *Role) Scan(value interface{}) error { *r = Role(value.(string)) return nil }
Die zweite Funktion, Value, ist für die Konvertierung eines Werts in ein datenbankkompatibles Format verantwortlich. Der angegebene Code ist falsch, da er nicht der erwarteten Funktionssignatur für „driver.Valuer“ folgt. Der korrigierte Code lautet:
func (r Role) Value() (driver.Value, error) { return string(r), nil }
Fazit
Durch Korrigieren der Typkonvertierung in der Scan-Methode und Anpassen der Funktionssignatur in der Value-Methode sollte der Code funktionieren wie beabsichtigt, sodass der benutzerdefinierte Rollentyp mit dem Datenbanktreiber interagieren kann.
Das obige ist der detaillierte Inhalt vonWarum schlägt die Typzusicherung fehl, wenn die Schnittstellen „Valuer“ und „Scanner“ in Go implementiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!