接口的主要工作是仅提供由方法名称,输入参数和返回类型组成的方法签名集合。 由类型(例如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)
}
















