美文网首页
22 Golang中的接口(二)

22 Golang中的接口(二)

作者: learninginto | 来源:发表于2021-04-07 09:49 被阅读0次
    空接口

    空接口表示没有任何约束,因此任何类型变量都可以实现空接口

    用空接口可以表示任何数据类型

    • demo
    package main
    
    import "fmt"
    
    //空接口
    type A interface {
    
    }
    
    func main () {
        var a A
        var str = "你好Golang"
        a = str // 让字符串实现A接口
        fmt.Printf("值:%v 类型:%T\n", a, a)
        // 值:你好Golang 类型:string
    
        var num = 20
        a = num // 让int类型实现A接口
        fmt.Printf("值:%v 类型:%T", a, a)
        // 值:20 类型:int
    
        var flag = true
        a = flag
        fmt.Printf("值:%v 类型:%T", a, a)
        // 值:20 类型:int值:true 类型:bool  
    }
    
    • 空接口可以直接当做类型来使用,可以表示任意类型
    var a interface {}
    a = 20
    fmt.Printf("值:%v 类型:%T\n", a, a)
    //值:20 类型:int
    
    a = "你好Golang"
    fmt.Printf("值:%v 类型:%T\n", a, a)
    //值:你好Golang 类型:string
    
    a = true
    fmt.Printf("值:%v 类型:%T\n", a, a)
    //值:true 类型:bool
    
    • 空接口可以作为函数的参数

    使用空接口实现可以接收任意类型的函数参数

    func show(a interface{}){
        fmt.Printf("值:%v 类型:%T\n", a, a)
    }
    
    func main () {
        show(20)
        show("你好Golang")
        slice := []int{1,2,3,4}
        show(slice)
        //值:20 类型:int
        //值:你好Golang 类型:string
        //值:[1 2 3 4] 类型:[]int
    }
    
    • map的值实现空接口

    map的值默认只能是一种类型

    var m1 = make(map[string]string)
    m1["username"] = "zhangsan"
    m1["age"] = "20"
    fmt.Println(m1)//map[age:20 username:zhangsan]
    
    var m2 = make(map[string]interface{})
    m2["username"] = "lisi"
    m2["age"] = 28
    m2["married"] = true
    fmt.Println(m2)//map[age:28 married:true username:lisi]
    
    • 切片实现空接口
    var s1 = []int{12,3,4,5}
    fmt.Println(s1)
    //[12 3 4 5]
    
    var s2 = []interface{}{1,3,"hello",true}
    fmt.Println(s2)
    //[1 3 hello true]
    
    类型断言

    当要判断空接口中值的类型时,可以使用类型断言

    x.(T)
    

    x:表示类型为interface{}的变量
    T: 表示断言x可能是的类型

    func main () {
        var a interface{}
        a = "hello"
        v, ok := a.(string)
        if ok {
            fmt.Printf("%v是一个string类型\n",v)
        } else {
            fmt.Println("断言失败")
        }
    }
    
    • 判断数据类型

    x.(type)判断一个变量的类型,只能用在swtich语句中

    func MyPrint1(x interface{}) {
        if _, ok := x.(string); ok {
            fmt.Println("string类型")
        } else if _, ok := x.(int); ok {
            fmt.Println("int类型")
        } else if _, ok := x.(bool); ok {
            fmt.Println("bool类型")
        }
    }
    
    func MyPrint2(x interface{}) {
        switch x.(type){
        case int :
            fmt.Println("int类型")
        case string:
            fmt.Println("string类型")
        case bool:
            fmt.Println("bool类型")
        default :
            fmt.Println("其他类型")
        }
    }
    
    func main() {
        MyPrint1("你好golang")
        MyPrint2(true)
    }
    
    • 类型断言结合接口使用
    type Usber interface {
        start()
        stop()
    }
    
    //电脑
    type Computer struct {
    }
    
    func (c Computer) work(usb Usber) {
        //判断usb类型,如果是Phone去调用start(),如果是Camera去调用stop()
        if _, ok := usb.(Phone); ok {
            usb.start()
        } else {
            usb.stop()
        }
    }
    
    type Phone struct {
        Name string
    }
    
    //手机
    func (p Phone) start() {
        fmt.Println(p.Name, "启动")
    }
    
    func (p Phone) stop() {
        fmt.Println(p.Name, "关机")
    }
    
    //相机
    type Camear struct {
    }
    
    type Camera struct {
    }
    
    func (p Camera) start() {
        fmt.Println("相机启动")
    }
    
    func (p Camera) stop() {
        fmt.Println("相机关机")
    }
    
    func main() {
        var computer = Computer{}
        var phone = Phone{
            Name: "Huawei",
        }
        var camera = Camera{}
        computer.work(phone)
        computer.work(camera)
    }
    

    相关文章

      网友评论

          本文标题:22 Golang中的接口(二)

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