Golang 接口
Golang 接口
案例
//定义一个接口
type Usb interface {
start()
stop()
sum(int, int) int
}
type phone struct {
}
//实现接口方法
func (p phone) start() {
fmt.Println("implement phone start")
}
func (p phone) stop() {
fmt.Println("implement phone stop")
}
func (p phone) sum(i int, i2 int) int {
return i + i2
}
//多态
func method(usb Usb) {
usb.start()
usb.stop()
}
func main() {
p := phone{}
//多态
method(p)
}
定义
interface
可以定义一组方法,但是这些不需要实现。并且interface
不能包含变量。
GO中接口不需要显示的实现,只要一个自定义数据类型,含有接口类型中所有的方法,那么这个自定义数据类型就实现这个接口。因此,Go中没有implement
这样的关键字
注意事项
-
接口本身不能创建实例, 但是可以指向一个实现了该接口的自定义类型的变量
-
接口中所有的方法都没有方法体
-
一个自定义类型需要将某个接口的所有方法都实现,我们就说这个自定义类型实现了该接口
-
一个自定义类型可以实现多个接口
-
Go中接口不能有任何变量
-
和Java相同的,接口支持多继承,一个接口可以继承多个接口
-
只要是自定义数据类型,就可以实现接口, 不仅仅是接口体
//定义一个接口 type person interface { say() } type Integer int //Integer实现person接口 func (i Integer) say() { fmt.Println("implement person say") } func main() { var num Integer = 10 num.say() }
-
interface
类型默认是一个指针(引用类型),如果没有对interface
初始化,那么输出nil
-
空接口
interface{}
没有任何方法,所有类型都实现了空接口,即我们可以把任何一个变量赋给空接口(包括基本变量)type T interface { } func name(i T) { fmt.Println("hello world") } func main() { var num int = 1 name(num) }
例子
type Hero struct {
Name string
Age int
}
type heroSlice []Hero
func (h heroSlice) Len() int {
return len(h)
}
//从大到小, 最大堆, 每次都将比h[j].Age大放在队列头,成为下一个h[j]
func (h heroSlice) Less(i, j int) bool {
//i是比较的元素,j是被比较的元素
return h[i].Age > h[j].Age
}
func (h heroSlice) Swap(i, j int) {
tmp := h[i]
h[i] = h[j]
h[j] = tmp
}
func main() {
slices := heroSlice{
Hero{"张三", 2},
Hero{"李四", 23},
Hero{"王五",1},
}
fmt.Println(slices)
sort.Sort(slices)
fmt.Println(slices)
}