Typ-Assertion in Go: Behebung des Fehlers „Typwechsel bei Nicht-Schnittstellenwert nicht möglich“
Beim Arbeiten mit Typ-Assertionen in Go: Es ist möglich, dass der Fehler „Schalter kann nicht für Nicht-Schnittstellenwert eingegeben werden“ auftritt. Lassen Sie uns anhand eines Beispiels mit einem benutzerdefinierten Typ untersuchen, was dies bedeutet und wie Sie es beheben können.
Bedenken Sie den folgenden Codeausschnitt:
package main import "fmt" import "strconv" type Stringer interface { String() string } type Number struct { v int } func (number *Number) String() string { return strconv.Itoa(number.v) } func main() { n := &Number{1} switch v := n.(type) { case Stringer: fmt.Println("Stringer:", v) default: fmt.Println("Unknown") } }
Wenn Sie diesen Code ausführen, werden Sie Folgendes tun Es kommt der Fehler „Schalter kann nicht für Nicht-Schnittstellenwert eingegeben werden.“ Dies zeigt an, dass die Typzusicherung für einen Nicht-Schnittstellenwert ausgeführt wird. In diesem Fall ist n ein Zeiger auf eine Zahlenstruktur, die keine Schnittstelle ist.
Die Lösung besteht darin, den Wert in eine Schnittstelle{} umzuwandeln, bevor versucht wird, den Typ zu bestätigen. Dies liegt daran, dass Typzusicherungen nur für Schnittstellenwerte durchgeführt werden können. Hier ist der korrigierte Code:
func main() { n := &Number{1} switch v := interface{}(n).(type) { case Stringer: fmt.Println("Stringer:", v) default: fmt.Println("Unknown") } }
Wenn Sie nun den Code ausführen, wird „Stringer: 1“ ausgegeben. Dies liegt daran, dass die Umwandlung von n in interface{} die Behandlung als Schnittstellenwert für die Typzusicherung ermöglicht.
Das obige ist der detaillierte Inhalt vonGeben Sie Assertion in Go ein: Warum kann „Switch on Non-Interface Value' nicht eingegeben werden und wie lässt sich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!