go语言中,接口是一个编程规约,也是一组方法的集合。
1、接口的定义
//关键字 interface,定义一个叫 print的接口类型
type Print interface {
Speak()
Age()
}
接口定义大括号内可以是方法声明的集合。
2、接口的初始化和调用
单纯地声明一个接口变量没有任何意义,接口只有被初始化为具体的类型时才有意义。接口起到抽象和适配的作用。没有初始化的接口变量,其默认值是nil
接下来开始使用接口,废话不多说上代码!
package main
import "fmt"
//定义接口
type Print interface {
Speak()
Age()
}
//定义一个结构体
type Me struct {
name string
age int
}
//接口函数的实现
func (m *Me) Speak() {
fmt.Println("My name is",m.name)
}
//接口函数的实现
func (m *Me) Age() {
fmt.Println("My age is",m.age)
}
func main() {
//定义一个Print的接口变量
var i Print
//实例化一个Me类型变量
me := Me{"ssj",26}
//方法1:初始化接口变量的,并调用接口的方法
i = Me{"SSJ",26}
i.Speak()
i.Age()
//方法2:初始化接口变量,并调用其方法
Print(me).Speak()
Print(me).Age()
}
编译并运行程序
3、接口类型的断言
if o,ok := i.(TypeName); ok {
....
}
TypeName是具体类型名,此时如果接口i绑定的实例类型就是具体类型TypeName,则ok为true,变量o的类型就是TypeName,变量o的值就是TypeName接口底层绑定的实例值的副本。
package main
import "fmt"
type Print interface {
Speak()
Age()
}
type Me struct {
name string
age int
}
func (m Me) Speak() {
fmt.Println("My name is",m.name)
}
func (m Me) Age() {
fmt.Println("My age is",m.age)
}
func main() {
m := Me{"zmj",12}
var a interface{} = m
if o,ok := a.(Print);ok{
o.Speak()
o.Age()
}
}