前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang-101-hacks(21)——类型断言&类型开关

golang-101-hacks(21)——类型断言&类型开关

作者头像
羊羽shine
发布2019-06-24 09:24:48
7710
发布2019-06-24 09:24:48
举报
文章被收录于专栏:Golang开发

通过类型断言(type assertion)方式来判断接口的具体类型, Sometimes, you may want to know the exact type of an interface variable. In this scenario, you can use type assertion:

代码语言:javascript
复制
x.(T)

x”的类型必须为interface的变量,“T”表示是推断的类型。例如: x is the variable whose type must be interface, and T is the type which you want to check. For example:

代码语言:javascript
复制
package main

import "fmt"

func printValue(v interface{}) {
    fmt.Printf("The value of v is: %v", v.(int))
}

func main() {
    v := 10
    printValue(v)
}

运行结果如下

代码语言:javascript
复制
The value of v is: 10

在上面的例子中,使用' v.(int) '来断言' v '是整数(int)类型。 In the above example, using v.(int) to assert the v is int variable. 如果“类型断言”推断错误,将会导致程序运行恐慌(panic):将下面断言语句 if the type assertion operation fails, a running panic will occur: change

代码语言:javascript
复制
fmt.Printf("The value of v is: %v", v.(int))  

修改成如下

代码语言:javascript
复制
fmt.Printf("The value of v is: %v", v.(string))

程序运行结果会出现错误

代码语言:javascript
复制
panic: interface conversion: interface is int, not string

goroutine 1 [running]:
panic(0x4f0840, 0xc0820042c0)
......

为了提高程序的健壮性,类型断言type assertion实际上返回一个额外的布尔变量来判断这个断言类型是否正确。将程序修改成如下:

To avoid this, type assertion actually returns an additional boolean variable to tell whether this operations holds or not. So modify the program as follows:

代码语言:javascript
复制
package main

import "fmt"

func printValue(v interface{}) {
    if v, ok := v.(string); ok {
        fmt.Printf("The value of v is: %v", v)
    } else {
        fmt.Println("Oops, it is not a string!")
    }

}

func main() {
    v := 10
    printValue(v)
}

这次运行结果如下

代码语言:javascript
复制
Oops, it is not a string!

此外,您还可以使用“type switch”,通过“type assertion”来确定变量的类型,并执行相应的操作。如下面的例子: Furthermore, you can also use type switch which makes use of type assertion to determine the type of variable, and do the operations accordingly. Check the following example:

代码语言:javascript
复制
package main

import "fmt"

func printValue(v interface{}) {
    switch v := v.(type) {
    case string:
        fmt.Printf("%v is a string\n", v)
    case int:
        fmt.Printf("%v is an int\n", v)
    default:
        fmt.Printf("The type of v is unknown\n")
    }
}

func main() {
    v := 10
    printValue(v)
}

运行结果如下

代码语言:javascript
复制
10 is an int

与类型断言不同,“type switch”在括号中并没有指定的变量类型(例如“int”),而使用了关键字type。 参考: Effective Go; Go – x.(T) Type Assertions; How to find a type of a object in Golang?.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.06.23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档