go语言接口:
go语言的接口设计是非侵入式的,接口的编写者无需知道接口被那些类型实现。而接口实现者只需要知道实现的是什么样子的接口,但无须指明实现哪一个接口。不像其他语言需要用implement来指出实现了哪个接口。有几个需要注意的地方:
- interface本身也是一种类型,可以定义一组方法,但是接口中不能包含任何的变量
- 必须实现了接口中的所有方法,才能调用接口
- 实现接口的方法必须和接口中定义的方法格式一致,包括函数名和返回值等。
多态:
一种的事物的多种形态,都可以按照统一的接口进行操作。
理解:比如go语言sort包中提供了一个排序的Sort接口,它可以对整数,浮点数,字符串等进行排序,只要实现接口中定义的下面三个方法,就可以调用Sort方法进行排序,不用每一种类型都去定义一种实现的方法。
我们从go网站上面可以查到Sort方法是这样:func Sort(data Interface)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
type Interface interface {
// Len is the number of elements in the collection.
// Len 为集合内元素的总数
Len() int
// Less reports whether the element with
// index i should sort before the element with index j.
//
// Less 返回索引为 i 的元素是否应排在索引为 j 的元素之前。
Less(i, j int) bool
// Swap swaps the elements with indexes i and j.
// Swap 交换索引为 i 和 j 的元素
Swap(i, j int)
}
|
自己实现接口进行排序:
我们自己定义一种类型MyStringList,实现Sort中的Len(),Less(i,j int),Swap(i,j int )这三个方法,也就是实现了Sort接口,就可以调用sort包中的Sort方法进行排序。如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package main
import (
"fmt"
"sort"
)
type MyStringList []string
func (m MyStringList) Len() int {
return len(m)
}
func (m MyStringList) Less(i, j int) bool {
return m[i] < m[j]
}
func (m MyStringList) Swap(i, j int) {
m[i], m[j] = m[j], m[i]
}
func main() {
names := MyStringList{
"3.Triple",
"2.Double",
"5.Penta",
}
sort.Sort(names)
for _, v := range names {
fmt.Printf("%s\n", v)
}
}
|
利用go语言提供的StringSlice进行排序:
实际上,也是实现了Sort接口定义的那三种方法,然后直接提供给我们,我们就可以直接调用了,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package main
import (
"fmt"
"sort"
)
func main() {
s := sort.StringSlice{
"3.Triple",
"2.Double",
"5.Penta",
}
sort.Sort(s)
for _, v := range s {
fmt.Println(v)
}
}
|
类似的还有int类型的,比如IntSlice等也是实现了Sort接口,从而我们可以直接进行调用。