In Go können Sie mit einem Typwechsel einen Wert mehreren Typen zuordnen. Wenn jedoch mehrere Fälle in einem Typwechsel verwendet werden, ist das Verständnis der Variablentypzuweisungen von entscheidender Bedeutung.
Beachten Sie den folgenden Codeausschnitt:
package main import ( "fmt" ) type A struct { a int } func (this *A) test() { fmt.Println(this) } type B struct { A } func main() { var foo interface{} foo = A{} switch a := foo.(type) { case B, A: a.test() } }
Beim Ausführen dieses Codes wird ein Fehler ausgelöst: a .test undefiniert (Typ Schnittstelle {} ist Schnittstelle ohne Methoden). Dieser Fehler tritt auf, weil die Variable a trotz des Typwechsels den Typ interface{} beibehält.
Um dieses Verhalten zu verstehen, müssen wir uns auf die Go-Spezifikation beziehen:
"Der TypeSwitchGuard kann enthalten Wenn diese Form verwendet wird, wird die Variable am Anfang des impliziten Blocks in jeder Klausel deklariert. In Klauseln mit einem Fall, der genau einen Typ auflistet, hat die Variable andernfalls den Typ von Die Ausdruck im TypeSwitchGuard.“
Da in unserem Fall mehrere Typen (B und A) in der Case-Klausel angegeben sind, behält die Variable a den Typ des Ausdrucks im TypeSwitchGuard bei, nämlich interface{}. Das bedeutet, dass der Compiler uns nicht erlaubt, die test()-Methode auf einer Schnittstelle aufzurufen, da interface{} keine test()-Methode hat.
Um dieses Problem zu beheben, können wir Typzusicherungen verwenden, die dies zulassen uns zu behaupten, dass ein Wert einen bestimmten Typ hat. Hier ist eine aktualisierte Version des Codes, der Typzusicherungen verwendet:
package main import ( "fmt" ) type A struct { a int } func (this *A) test() { fmt.Println(this) } type B struct { A } func main() { var foo interface{} foo = &B{} if a, ok := foo.(tester); ok { fmt.Println("foo has test() method") a.test() } }
Das obige ist der detaillierte Inhalt vonWarum führt ein Typwechsel mit mehreren Fällen in Go zu einem „undefinierten' Methodenfehler?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!