Go之接口

package main
import "fmt"
type dog struct{}
func (d dog)say(){
	fmt.Println("汪汪汪")
}
type cat struct{}
// 值接收者实现接口
func (d cat)say(){
	fmt.Println("喵喵喵")
}

type person struct{}
// 指针接收者实现接口
func (p *person)say(){
	fmt.Println("啊啊啊")
}
// 接口不管你是什么类型,它只管你要实现什么方法
// 定义一个抽象的类型。只要实现了say()的类型都可以成为sayer
type sayer interface{
	say()
}
// 打的函数
func da(arg sayer){
	arg.say()
}
func main(){
	// 在go语言中,接口是一种类型,是一种抽象的类型
	// 接口做的事情就像是定义一个协议(规则)
	// 只要一台辑器有洗衣服和帅干的功能
	// 我们就称它为洗衣机。不关心属性(数据),只关心行为(方法)
	//  一个对象只要全部实现了接口中的方法,那么就实现了该接口
	c1 := cat{}
	da(c1)
	d1 := dog{}
	da(d1)

	// 使用值类型接收者实现接口
	// 类型的值和类型的指针都能够保存到接口
	var s sayer
	c2 := cat{}
	s = &c2
	s = c2
	fmt.Println(s)

	// 使用指针接收者实现接口。
	// 只有指针类型能够保存到接口变量中
	p1 := &person{}
	s = p1
	fmt.Println(s)

	// 空接口
	// 空接口是指没有定义任何方法的接口
	// 因此任何类型都实现了空接口
	// 空接口的类型可以存储任意类型的变量
	var x interface{}
	x = 100
	x = true
	x = "你猜我是谁"
	fmt.Println(x)
	// 类型断言
	_, ok := x.(string)
	
	fmt.Println(ok) // 如果x是string类型,ok是true,否则是flase

	// 使用空接口作为函数的参数
	myPrintln("ddd")	
	// 空接口作为map的value
	var m = make(map[string]interface{})
	m["name"] = "娜扎"
	m["age"] = 18
	myPrintln(m)
}


func  myPrintln(age interface{}){
	fmt.Println(age)
}
posted @ 2020-10-18 16:10  cl94  阅读(72)  评论(0编辑  收藏  举报