GoLang:接口
学习自:Go教程119页
1、说明
接口是为了定义某些标准,接口本身不需要实现这些标准。
2、定义
接口中不能有任何数据字段,只能有函数声明
type 接口名称 interface{
函数声明
}
接口中嵌入另一个接口

但是嵌入的接口中方法不能重名,把自己嵌入自己
3、例子
1)常规用法
定义一个接口
type usber interface{
start()
stop()
}
定义两个将要使用该接口的结构体
type Computer struct{
name string
model string
}
type Phone struct{
name string
model string
}
实现接口方法(和实现正常方法的写法相同,区别在于要为每种结构体各写一遍)
//为Computer实现接口方法
func (cm Computer)start(){
fmt.Println("启动电脑")
}
func (cm Computer)stop(){
fmt.Println("关闭电脑")
}
//为Phone实现接口方法
func (p Phone)start(){
fmt.Println("启动手机")
}
func (p Phone)stop(){
fmt.Println("关闭手机")
}
使用接口
//在另一个函数中使用接口中的方法
func working(u usber){
u.start()
u.stop()
}
func main(){
cm := Computer{"戴尔","F1234"}
working(cm)//启动电脑,关闭电脑
p := Phone{"华为","M10"}
working(p)//启动手机,关闭手机
}
实现接口的结构体就像Java语言中实现接口的子类一样,后续使用时用结构体代替参数中的接口进行具体操作,则和运行时多态类似。
//work定义
func working(u user){
...
}
//具体使用
cm:=Computer{...}
p:=Phone{...}
working(cm)
working(p)
只有实现了接口中的所有方法,才算实现了接口,才能用接口类型接收。如果只是实现了部分方法,则不能接收该类型。
2)定义接口变量,去接收实现了接口的结构体
type studier interface {
read()
}
type Person struct{
name string
age int
}
func (p Person)read(){
fmt.Println(p.name,"正在学习")
}
func main(){
//定义接口变量
var s studier
//用接口变量接收实现了接口的结构体
s = Person{"lnj",33}
}
用接口接收结构体后,只能进行整体访问,不能进行单个内部数值修改,因为接口没有自己的属性:
fmt.Println(s) //正确 fmt.Println(s.name)//错误
要想访问结构体属性,必须将接口类型还原为原始类型:
方法①:类型断言 ok-idiom
if p,ok :=s.(Person);ok{
fmt.Println(p,p.name)
}
这种s.(Person)的写法称为类型断言,通过这种ok-idiom的方式可以将接口类型还原为原始类型。
方法②:type switch
switch p := s.(type){
catch Person:
p.name="zs"
fmt.Println(p) //{zs 33}
default:
fmt.Println("不是Person类型")
}

浙公网安备 33010602011771号