这是我参与更文挑战的第5天,活动详情查看: 更文挑战
Go中接口类型是一种类型,像是一种抽象的类型,像是将许多方法打包在一起。
接口类型使用场景?
当我们不关心属性(数据),只关心方法。例如当你需要编写一个函数,输入参数(例如小猫,小狗)就会实现抚摸小猫小狗的方法,这个时候面对不同的函数参数,如果按照之前的方法,就需要编写多个函数。
func momo(c cat){
//接收一个参数,传进来谁,就摸摸谁
c.speak()
}
func momo(d dog){
//接收一个参数,传进来谁,就摸摸谁
d.speak()
}
而采用接口时,就可以改写为下列示例代码1。
接口编写者不用担心接口会被哪些类型实现,只需要考虑实现的是什么样的接口。
一、接口的定义
接口是一种类型,它规定了变量的方法。
type 接口名 interface {
方法名1(参数1,参数2..)(返回值1,返回值2..)
方法名(参数1,参数2..)(返回值1,返回值2..)
.....
}
二、接口的实现
如果一个变量实现了接口中规定的所有的方法,那么这个变量就实现了这个接口,可以称为这个接口类型的变量。
实例代码1:
package main
import "fmt"
//引出接口的实例
//定义一个能够实现speak方法的接口类型
type speaker interface {
speak() //只要实现了speak方法的变量都是speaker类型
}
type cat struct{
age int
name string
}
type dog struct{
age int
name string
}
func (c cat)speak(){
fmt.Println("喵喵喵")
}
func (d dog)speak(){
fmt.Println("汪汪汪")
}
func momo(s speaker){
//接收一个参数,传进来谁,就摸摸谁
s.speak()
}
func main(){
c1 := cat {
age : 1,
name : "小花",
}
var d1 dog
momo(c1)
momo(d1)
//定义一个接口类型变量
var ss speaker
fmt.Printf("%T\n",ss)
ss = c1
fmt.Printf("%T\n",ss)
fmt.Println(ss)
}
输出结果1:
喵喵喵
汪汪汪
<nil>
main.cat
{1 小花}
注意:
(1)只有实现了接口定义的所有方法,才可以将这个变量类型赋值给接口;
(2)接口类型的变量等于哪个类型,它保存的类型就对应哪个变量,这样才能实现接口变量能保存任意一个值;
(3)接口在最初定义,未赋值前,是nil类型。