GO接口的定义、实现

208 阅读2分钟

这是我参与更文挑战的第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类型。