golang入门笔记—接口

//接口是一种类型,它规定了变量有哪些方法
//在编程中会遇到以下场景:
//我不关心一个变量是什么类型,我只关心能调用它的什么方法
//接口变量的存储分为两部分:类型和值

// type 接口名 interface{
// 	方法名1(参数1,参数2...)(返回值1,返回值2)
// 	方法名2(参数1,参数2...)(返回值1,返回值2)
// 	...
// }

type speaker interface {
	speak() //只要实现了speak方法的对象都是speaker类型
}
type cat struct{}

type dog struct{}

type person struct{}

func (c cat) speak() {
	fmt.Println("喵喵喵~")
}

func (d dog) speak() {
	fmt.Println("汪汪汪~")
}

func (p person) speak() {
	fmt.Println("哈哈哈~")
}

func da(x speaker) {
	x.speak()
}

func main() {
	var c1 cat
	var d1 dog
	var p1 person

	da(c1)
	da(d1)
	da(p1)

	var s speaker         //声明一个接口类型
	s = c1
	s.speak()   
	fmt.Printf("%T\n", s) // s的类型为cat类型
}



//使用值接收者实现接口与使用指针接收者实现接口的区别
//使用值接收者实现接口,结构体类型和结构体指针类型的变量都能存
//指针接收者实现接口只能存结构体指针类型的变量
type animal interface {
	move()
	eat(string)
}

type cat struct {
	name string
	feat int8
}

//使用指针接收者实现所有接口的所有方法
func (c *cat) move() {
	fmt.Println("走猫步...")
}

func (c *cat) eat(food string) {
	fmt.Printf("猫吃%s...\n", food)
}

func main() {
	var a1 animal
	c1 := cat{"tom", 4}
	c2 := &cat{"加菲", 4}
	a1 = &c1
	fmt.Println(a1)
	a1 = c2
	fmt.Println(a1)
}


//接口嵌套
type animal interface{
	mover
	eater
}//就相当于move()和eat(string)

type mover interface{
	move()
}

type eater interface{
	eat(string)
}

//空接口
interface{}//没有必要起名字
//interface:关键字
//interface{}:空接口类型

func show(a interface{}){
	fmt.Printf("type:%T value:%v\n",a,a)
}

func main(){
	var m1 map[string]interface{}
	m1 = make(map[string]interface{},16)
	m1["name"]="周林"
	m1["age"] = 9000
	m1["merried"]=true
	m1["hobby"]=[...]string{"唱","跳","rap"}
	fmt.Println(m1)
	show(false)
	show(nil)
	show(m1)
}


//类型断言
//x.(T)该语法返回两个参数,第一个参数是x转化为T类型后的变量,第二个值是一个布尔值,若为true则表示断言成功,为false则表示断言失败
func assign(a interface{}) {
	fmt.Printf("%T\n", a)
	str, ok := a.(string)
	if !ok {
		fmt.Println("猜错了")
	} else {
		fmt.Println("传来的是一个字符串", str)
	}
}

func assign2(a interface{}) {
	fmt.Printf("%T\n", a)
	switch t := a.(type) { //switch a.(type)比较的是类型而不是具体的值
	case string:
		fmt.Println("是一个字符串", t)
	case int:
		fmt.Println("是一个int:", t)
	case bool:
		fmt.Println("是一个bool:", t)
	}
}

func main() {
	assign(100)
	assign2("zyj")
}

//if v,ok:=a.(int8);!ok{
//	fmt.Println("猜对了,a是int8",v)
//}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值