考虑以下 Go 代码:
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.") }
第一个类型断言在显式时有效将类型声明为 func(int) bool。然而,使用类型别名 someFuncy 的第二个会出现恐慌。
与强制转换不同,Go 中的类型断言严格比较所断言值的实际类型。因此,类型别名 SomethingFuncy 尽管与 func(int) bool 共享相同的签名,但被视为不同的类型。
类型断言在以下代码中执行,这只是比较类型是否相等:
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 } }
使用类型别名时此比较失败,因为它需要精确的类型匹配。
以上是为什么 Go 的类型断言因类型别名而失败?的详细内容。更多信息请关注PHP中文网其他相关文章!