Go语言接口
Go语言中的接口是非侵入式的:让接口与实现者真正解耦!
- 实现者只实现目标方法,而无需指明是哪个接口的方法!
- 接口更无需知道哪些类型实现了接口!
- 接口中只有方法声明,或嵌套的接口,不能有其他类型结构,常量等!
接口声明
类似,接口和结构体一样,都是一种类型:(type
关键字)
type 接口类型名 interface{
方法名1(参数列表1) 返回值列表1
方法名2(参数列表2) 返回值列表2
......
}
注意点:
- 接口类型名常以
er
结尾,比如:Writer
; - 接口名、方法名首字母大写才能被其他包访问;
- 参数列表 和 返回值列表 的参数名都可以省略!
实现接口
条件:
- 接口方法与实现的方法格式必须一致
- 实现结构体必须实现接口中所有方法
type Writer interface {
Write(v interface{}) error
}
type File struct {
}
func (f *File) Write(v interface{}) error{
.....
}
使用结构体实现的接口方法
- 实现结构体直接使用
file := new(File)
file.Write(Data)
- 多态特性: 只是接口名和结构体指针之间是多态情况!
func main() {
f := new(File)
get(f) //"file"
i := new(Io)
get(i) //"IO"
}
func get(w Writer) {
w.Write("")
}
type Writer interface {
Write(v interface{})
}
type File struct {}
func (f *File) Write(v interface{}) {
fmt.Println("file")
}
type Io struct {}
func (i *Io) Write(v interface{}) {
fmt.Println("IO")
}
接口也可以嵌套
接口之间也可以继承:
type Writer interface {
}
type Closer interface {
}
type WriterCloser interface {
Writer
Closer
}
接口与类型间转换
一、断言语句
t,ok := i.(T)
【双向的:可以指针转接口,也可以接口转指针!】
- 如果ok是
true
那么,t 就是 i 转化后的T类型;否则,i 是T类型的默认值!
二、switch
分支类型断言:
switch 接口变量.(type) {
case类型1:
// 变量是类型1时的处理
case类型2:
// 变量是类型2时的处理
…
default:
// 变量不是所有case中列举的类型时的处理
}
三、reflect.TypeOf(T)
反射获取变量类型!
空接口类型(interfac{})
所有类型都实现的接口,可以保存所有值的类型,相当于Java中的Object,但比Object范围更广,它把基本类型、指针等任何类型都包括!