首页  >  文章  >  后端开发  >  为什么 Go 中自定义类型类型断言失败,但转换成功?

为什么 Go 中自定义类型类型断言失败,但转换成功?

Linda Hamilton
Linda Hamilton原创
2024-11-04 07:14:02637浏览

Why Does Type Assertion Fail with Custom Types in Go, But Conversion Succeeds?

Go 中的命名类型断言和转换

在 Go 中,命名类型断言和转换允许开发人员操作自定义和预定义的数据类型。但是,在处理重新定义预定义类型的自定义类型时,可能会出现误解。让我们详细探讨这个问题。

考虑以下代码示例:

<code class="go">type Answer string

func acceptMe(str string) {
    fmt.Println(str)
}

func main() {
    type Answer string
    var ans Answer = "hello"

    // Illegal usage
    acceptMe(ans)

    // Failed type assertion
    acceptMe(ans.(string))

    // Works (but why?)
    acceptMe(string(ans))
}</code>

问:为什么类型断言 (ans.(string)) 失败,而转换(string(ans)) 有效吗?

A: 类型断言仅适用于接口类型,它表示值可以满足的契约。由于像 Answer 这样的自定义类型不是接口,因此尝试使用类型断言语法来断言它们将导致错误。

相反,转换显式地将一种类型转换为另一种类型。转换 (string(ans)) 成功,因为 Answer 具有基础字符串类型。 Go 会在将 Ans 传递给 AcceptMe 之前将其隐式转换为其底层字符串。

附加说明:

  • 像 Answer 这样的自定义类型本质上是现有类型的别名。它们不会添加新的功能或行为。
  • 类型断言提供运行时类型检查,而转换则执行隐式类型强制。
  • 在处理包装预定义类型的自定义类型时,通常建议使用转换而不是类型断言,因为它们更有效,并且如果基础类型匹配则总是成功。

以上是为什么 Go 中自定义类型类型断言失败,但转换成功?的详细内容。更多信息请关注PHP中文网其他相关文章!

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