22 Golang中的接口(二)
2021-04-07 本文已影响0人
learninginto
空接口
空接口表示没有任何约束,因此任何类型变量都可以实现空接口
用空接口可以表示任何数据类型
- 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)
}