go 类型断言_聊聊golang的类型断言

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

1d3e623a07c64d21bc497db5c62915b5.png

类型断言

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)}

直接赋值的方式,如果断言为true则返回该类型的值,如果断言为false则产生runtime panic;j这里赋值直接panic

输出

intpanic: interface conversion: interface {} is int, not int32goroutine 1 [running]:main.main()        type_assertion.go:12 +0xdaexit 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!", 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值