go语言接口:

go语言的接口设计是非侵入式的,接口的编写者无需知道接口被那些类型实现。而接口实现者只需要知道实现的是什么样子的接口,但无须指明实现哪一个接口。不像其他语言需要用implement来指出实现了哪个接口。有几个需要注意的地方:

  1. interface本身也是一种类型,可以定义一组方法,但是接口中不能包含任何的变量
  2. 必须实现了接口中的所有方法,才能调用接口
  3. 实现接口的方法必须和接口中定义的方法格式一致,包括函数名和返回值等。

多态

一种的事物的多种形态,都可以按照统一的接口进行操作。

理解:比如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接口,从而我们可以直接进行调用。