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] }