您的位置 首页 golang

聊聊golang的类型断言

本文主要研究一下golang的类型断言

类型断言

 x.(T)
  
  • 断言x不为nil且x为T类型
  • 如果T不是接口类型,则该断言x为T类型
  • 如果T类接口类型,则该断言x实现了T接口

实例1

 func main() {
    var x interface{} = 7
    i := x.(int)
    fmt.Println(reflect.TypeOf(i))
    j := x.(int32)
    fmt.Println(j)
}
  

输出

 int
panic: interface conversion: interface {} is int, not int32

goroutine 1 [running]:
main.main()
        type_assertion.go:12 +0xda
exit status 2
  

不过一般为了避免panic,通过使用ok的方式

 func main() {
    var x interface{} = 7
    j, ok := x.(int32)
    if ok {
        fmt.Println(reflect.TypeOf(j))
    } else {
        fmt.Println("x not type of int32")
    }
}
  

switch type

另外一种就是variable.(type)配合switch进行类型判断

 func main() {
    switch v := x.(type) {
    case int:
        fmt.Println("x is type of int", v)
    default:
        fmt.Printf("Unknown type %T!\n", v)
    }
}
  

判断struct是否实现某个接口

 type shape interface {
    getNumSides() int
    getArea() int
}
type rectangle struct {
    x int
    y int
}

func (r *rectangle) getNumSides() int {
    return 4
}
func (r rectangle) getArea() int {
    return r.x * r.y
}

func main() {
    // compile time Verify that *rectangle implement shape
    var _ shape = &rectangle{}
    // compile time Verify that *rectangle implement shape
    var _ shape = (*rectangle)(nil)

    // compile time Verify that rectangle implement shape
    var _ shape = rectangle{}
}
  

输出

 cannot use rectangle literal (type rectangle) as type shape in assignment:
        rectangle does not implement shape (getNumSides method has pointer receiver)
  

小结

  • x.(T) 可以在运行时判断x是否为T类型,如果直接使用赋值,当不是T类型时则会产生runtime panic
  • 使用 var _ someInterface = someStruct{} 可以在编译时期校验某个struct或者其指针类型是否实现了某个接口

doc

  • Type_assertions
  • Go : Check if type implements an interface

文章来源:智云一二三科技

文章标题:聊聊golang的类型断言

文章地址:https://www.zhihuclub.com/86555.shtml

关于作者: 智云科技

热门文章

发表评论

您的电子邮箱地址不会被公开。

网站地图