首页 >后端开发 >Golang >为什么 Go 的类型断言因类型别名而失败?

为什么 Go 的类型断言因类型别名而失败?

Barbara Streisand
Barbara Streisand原创
2024-12-16 05:47:12321浏览

Why Does Go's Type Assertion Fail with Type Aliases?

如何在 Go 中转换为类型别名?

考虑以下 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn