Go中的Interface使用

概述

  • 在看别人的源码时候,时常看到别人在go编程时,使用Interface这种类型作为参数,以及返回Interface这种类型。在这里我记录下我自己的一些理解和测试代码,供以后在编程中多注意这种编程技巧。
接口 Interface
  • 在go语言中,我理解接口的含义是指一种事物的特征集合,集合里面全是方法的实现,不包含其他字段,仅仅只有方法的签名,甚至都没有func这个关键字,如下代码示例:
type Animal interface {
	//表示一种特征即可,这里只要实现了Live方法就可以称之为动物
	Live()
}

type Bird interface {
	//表示鸟的特征,它是动物并且还能飞就是鸟
	Live()
	Fly()
}
  • 接口支持嵌套,如下代码:
type Animal interface {
	//表示一种特征即可,这里只要实现了Live方法就可以称之为动物
	Live()
}
type Bird interface {
	//表示鸟的特征,它是动物并且还能飞就是鸟
	Animal
	Fly()
}
  • 以上两种效果都是一致的。
结构体 Struct
  • 既然接口中没有具体的方法实现,那么在其他程序中,调用接口的方法又是如何调用的呢?确实最终调用的是结构体方法。
  • 在go语言中,结构体的方法实现了接口的方法则认为实现了这个接口,那么,调用接口的方法其实就是在调用这个结构体的方法。
  • 因为可以有多个结构体去实现接口的方法,各个结构体实现的方法不尽相同,这就使得go语言具有多态性。
  • 举个例子,鸟的种类很多,各种鸟我们可以看做是各种结构体,他们都有一个特征就是飞翔,各种鸟的飞翔形态又不一致,那么我们可以将飞翔作为接口中的方法,任何只要实现了飞翔这个方法,我就认为他是鸟,我通过调用鸟接口的飞翔方法,就可以得到不同鸟的飞翔形态。
  • 简易代码如下:
type Swallow struct {
	//这是燕子,他可以满足是动物也是鸟的特征,所以我们需要实现这两个接口,实现接口的方法就是将其中的接口方法具体实现。这里用到了结构体方法
	Name string
}

type Sparrow struct {
   //这是麻雀
	Name string
}

func ShowAnimalFeature(a Animal) {
   //这里传入一个动物的接口,我们知道动物的接口有Live方法,直接调用起来
	a.Live()
}

func ShowBirdFeature(a Bird) {
   //这里传入一个鸟类接口,我们知道鸟类的接口有Live和Fly方法,直接调用起来
	a.Live()
	a.Fly()
}
func (self *Swallow) Live() {
	//实现Animal的接口
	fmt.Println("I can live.----" + self.Name)
}

func (self *Swallow) Fly() {
	fmt.Println("I can fly.----" + self.Name)
}

func (self *Sparrow) Live() {
	//实现Animal的接口
	fmt.Println("I can live.----" + self.Name)
}

func (self *Sparrow) Fly() {
	fmt.Println("I can fly.----" + self.Name)
}
  • 在main函数中初始化两种鸟类各一只,然后调用特征方法。
func main() {
	var s Swallow
	s.Name = "燕子"
	ShowAnimalFeature(&s)
	ShowBirdFeature(&s)
	var f Sparrow
	f.Name = "麻雀"
	ShowAnimalFeature(&f)
	ShowBirdFeature(&f)
}
  • 运行结果如下:
I can live.----燕子
I can live.----燕子
I can fly.----燕子
I can live.----麻雀
I can live.----麻雀
I can fly.----麻雀
类型断言
  • 因为是接口,任何只要实现了接口中的方法(特征),都可以认为实现了这个接口。那么我们怎么来判断这个接口实现了哪种结构体或者接口呢,这里可以用到类型断言。
//类型断言
	var b Bird
	b = &f
	switch v := b.(type) {
	case *Swallow:
		fmt.Printf("Type Swallow %T\n", v)
	case *Sparrow:
		fmt.Printf("Type Sparrow %T\n", v)
	}
  • 输出结果
Type Sparrow *main.Sparrow

总结

  • 在编程设计中,尽可能地把特征都识别抽象出来,作为接口,方便后面通过接口的方法来调用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值