22 Golang中的接口(二)

learninginto · · 144 次点击 · · 开始浏览    

空接口

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

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

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

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:learninginto

查看原文:22 Golang中的接口(二)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

144 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传