美文网首页
聊聊golang的类型断言

聊聊golang的类型断言

作者: go4it | 来源:发表于2020-11-28 23:12 被阅读0次

    本文主要研究一下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)
    }
    

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

    输出

    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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/krhhwktx.html