golang的断言(Type Assertion)

  • 2020-07-16
  • 浏览 (839)

简介

golang的语言中提供了类型断言的功能。golang中的所有程序都实现了interface{}的接口,这意味着,所有的类型如string,int,int64甚至是自定义的struct类型都就此拥有了interface{}的接口,这种做法和java中的Object类型比较类似。那么在一个数据通过func funcName(interface{})的方式传进来的时候,也就意味着这个参数被自动的转为interface{}的类型。

func funcName(a interface{}) string {
     return string(a)
}

编译器将会返回:
cannot convert a (type interface{}) to type string: need type assertion

此时,意味着整个转化的过程需要类型断言。

类型断言使用

1. 直接断言使用

func funcName(a interface{}) string {
     return a.(string)
}

2.先判断在使用

如果断言失败一般会导致panic的发生,所以为了防止panic的发生,我们可以在断言时进行判断

value, ok := a.(string)

如果断言失败,那么ok的值将会是false,但是如果断言成功ok的值将会是true,同时value将会得到所期待的正确的值。示例:

func funcName(a interface{}) string {
    value, ok := a.(string)
    if !ok {
        fmt.Println("It's not ok for type string")
        return ""
    }
    return value
}

3.配合switch语句进行判断

var t interface{}
t = functionOfSomeType()
switch t := t.(type) {
default:
    fmt.Printf("unexpected type %T", t)       // %T prints whatever type t has
case bool:
    fmt.Printf("boolean %t\n", t)             // t has type bool
case int:
    fmt.Printf("integer %d\n", t)             // t has type int
case *bool:
    fmt.Printf("pointer to boolean %t\n", *t) // t has type *bool
case *int:
    fmt.Printf("pointer to integer %d\n", *t) // t has type *int
}
正文到此结束