接口的主要工作是仅提供由方法名称,输入参数和返回类型组成的方法签名集合。 由类型(例如struct结构体)来声明方法并实现它们。
关键字:interface
接口的定义:

type 接口类型名 interface{
    方法名1( 参数列表1 ) 返回值列表1
    方法名2( 参数列表2 ) 返回值列表2}

当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被接口所在的包(package)之外的代码访问。

1、使用结构体声明方法实现接口调用


//接口
//先定义结构体--> 声明方法--> 创建接口-->调用接口
package main

import "fmt"
//定义三个结构体,之所以定义结构体,是因为要创建方法的前提是创建结构体
type dog struct {   
	name  string
}
type cat struct {
	name string
}
type person struct {
	name string
}
//定义三个方法,之所以定义方法,是因为接口需要调用方法才能正常使用
func (d dog) say() {     //运行顺序3
	fmt.Printf("%v汪汪汪", d.name)

}
func (c cat) say()  {
	fmt.Println("喵喵喵")
}
func (p person) say()  {
	fmt.Println("啊啊啊")
}
//创建一个接口sayer,关键字interface,需要引用上面的方法
type sayer interface {
	say()               //运行顺序2
}

func da(arg sayer)  {    //定义一个函数调用,也就是接口实现什么方法,上面就需要有什么方法,这里实现的是say
	arg.say()           //运行顺序1
}

func main() {
	d1 :=dog{                 //结构体赋值到d1
		name:"小狗",
	}
	da(d1)       //运行开始,调用d1
}

运行结果:小狗汪汪汪

2、空接口的应用

//空接口的应用
/*
1、空接口类型可作为函数的参数
2、可以做map的value
*/

package main

import "fmt"

func main() {
	var x interface{}
	x = "Go语言"
	fmt.Println(x)
	x = 123
	fmt.Println(x)
	x = false
	fmt.Println(x)

	var m = make(map[string]interface{},16)
	m["name"] = "Go语言"
	m["age"]  = 18
	fmt.Println(m)
}

参考李文周老师博客:https://www.liwenzhou.com/posts/Go/12_interface/