golang:类型断言

刺骨的言语ヽ痛彻心扉 2022-02-16 11:51 411阅读 0赞

类型断言(Type Assertion)是一个使用在接口值上的操作,用于检查接口类型变量所持有的值是否实现了期望的接口或者具体的类型。

在Go语言中类型断言的语法格式如下:

  1. value, ok := x.(T)

其中,x 表示一个接口的类型,T 表示一个具体的类型(也可为接口类型)。

该断言表达式会返回 x 的值(也就是 value)和一个布尔值(也就是 ok),可根据该布尔值判断 x 是否为 T 类型:

  • 如果 T 是具体某个类型,类型断言会检查 x 的动态类型是否等于具体类型 T。如果检查成功,类型断言返回的结果是 x 的动态值,其类型是 T。
  • 如果 T 是接口类型,类型断言会检查 x 的动态类型是否满足 T。如果检查成功,x 的动态值不会被提取,返回值是一个类型为 T 的接口值。
  • 无论 T 是什么类型,如果 x 是 nil 接口值,类型断言都会失败。

示例代码如下:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. var x interface{
  7. }
  8. x = 10
  9. value, ok := x.(int)
  10. fmt.Print(value, ",", ok)
  11. }

在这里插入图片描述
需要注意如果不接收第二个参数也就是上面代码中的 ok,断言失败时会直接造成一个 panic。如果 x 为 nil 同样也会 panic

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. var x interface{
  7. }
  8. x = "Hello"
  9. value := x.(int)
  10. fmt.Println(value)
  11. }

在这里插入图片描述
类型断言还可以配合 switch 使用,示例代码如下:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. var a int
  7. a = 10
  8. getType(a)
  9. }
  10. func getType(a interface{
  11. }) {
  12. switch a.(type) {
  13. case int:
  14. fmt.Println("the type of a is int")
  15. case string:
  16. fmt.Println("the type of a is string")
  17. case float64:
  18. fmt.Println("the type of a is float")
  19. default:
  20. fmt.Println("unknown type")
  21. }
  22. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,411人围观)

还没有评论,来说两句吧...

相关阅读

    相关 typescript类型断言

    作用: 通过类型断言这种方式可以告诉编译器,“相信我,我知道自己在干什么”,你会比 TypeScript 更了解某个值的详细信息,你清楚的知道一个实体具有比它现有类型更确

    相关 golang类型转换与类型断言

    类型转换在程序设计中都是不可避免的问题。当然有一些语言将这个过程给模糊了,大多数时候开发者并不需要去关注这方面的问题。但是golang中的类型匹配是很严格的,不同的类型之间通常