🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 4.11\. Sorting 接口(interfaces)提供了一个简单形式的多态(polymorphism). 他们把对象的定义和 如何实现的分开处理,允许相同的接口可以有不能的实现方法。 参考这个简单的排序算法(sort algorithm)"progs/sort.go" ``` 13 func Sort(data Interface) { 14 for i := 1; i < data.Len(); i++ { 15 for j := i; j > 0 && data.Less(j, j-1); j-- { 16 data.Swap(j, j-1) 17 } 18 } 19 } ``` 我们要封装这个排序(sort)的接口(interface)仅需要三个方法。 ``` 07 type Interface interface { 08 Len() int 09 Less(i, j int) bool 10 Swap(i, j int) 11 } ``` 我们可以用任何类型的"Sort"去实现"Len", "Less" 和 "Swap". 这个"sort"包里面 包含一些方法(methods). 下面是整型数组的代码: ``` 33 type IntArray []int 35 func (p IntArray) Len() int { return len(p) } 36 func (p IntArray) Less(i, j int) bool { return p[i] < p[j] } 37 func (p IntArray) Swap(i, j int) { p[i], p[j] = p[j], p[i] } ``` 你看到的是一个没有任何类型的"结构体"(non-struct type). 在你的包里面你可以定义 任何你想定义的类型. 现在用"progs/sortmain.go"程序进行测试,用"sort"包里面的排序函数进行排序。 ``` 12 func ints() { 13 data := []int{74, 59, 238, -784, 9845, 959, 905, 0, 0, 42, 7586, -5467984, 7586} 14 a := sort.IntArray(data) 15 sort.Sort(a) 16 if !sort.IsSorted(a) { 17 panic("fail") 18 } 19 } ``` 如果我们为sort提供一个新类型,我们就需要为这个类型实现三个方法,如下: ``` 30 type day struct { 31 num int 32 shortName string 33 longName string 34 } 36 type dayArray struct { 37 data []*day 38 } 40 func (p *dayArray) Len() int { return len(p.data) } 41 func (p *dayArray) Less(i, j int) bool { return p.data[i].num < p.data[j].num } 42 func (p *dayArray) Swap(i, j int) { p.data[i], p.data[j] = p.data[j], p.data[i] } ```