22 Golang中的接口(二)

2021-04-07  本文已影响0人  learninginto
空接口

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

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

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的值默认只能是一种类型

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)
}
上一篇下一篇

猜你喜欢

热点阅读