Bedenken Sie den folgenden Go-Code:
package main import "fmt" type somethingFuncy func(int) bool func funcy(i int) bool { return i%2 == 0 } func main() { var a interface{} = funcy _ = a.(func(int) bool) // Works fmt.Println("Awesome -- apparently, literally specifying the func signature works.") _ = a.(somethingFuncy) // Panics fmt.Println("Darn -- doesn't get here. But somethingFuncy is the same signature as func(int) bool.") }
Die erste Typzusicherung funktioniert, wenn sie explizit erfolgt Deklarieren des Typs als func(int) bool. Allerdings gerät der zweite Typ, der den Typalias „somethingFuncy“ verwendet, in Panik.
Im Gegensatz zum Casting vergleichen Typzusicherungen in Go strikt den tatsächlichen Typ des zu behauptenden Werts. Daher wird der Typalias SomethingFuncy, obwohl er dieselbe Signatur wie func(int) bool hat, als eigenständiger Typ betrachtet.
Die Typzusicherung wird im folgenden Code durchgeführt, was einfach ist vergleicht die Typen auf Gleichheit:
func main() { var a interface{} = funcy switch v := a.(type) { case func(int) bool: // Type successfully asserted as func(int) bool case somethingFuncy: // Type successfully asserted as somethingFuncy default: // Type assertion failed } }
Dieser Vergleich schlägt fehl, wenn der Typalias verwendet wird, da er einen genauen Typ erfordert Spiel.
Das obige ist der detaillierte Inhalt vonWarum schlägt die Typzusicherung von Go mit Typaliasen fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!