在Go语言中,可以给任意类型(包括内置类型,但不包括指针类型)添加相应的方法,
例如:
1 type ByLength []string
2 func (s ByLength) Len() int {
3 return len(s)
4 }
5 func (s ByLength) Less(i, j int) bool {
6 return len(s[i]) > len(s[j])
7 }
8 func (s ByLength) Swap(i, j int) {
9 s[i], s[j] = s[j], s[i]
10 }
在这个例子中,我们定义了一个新类型ByLength,它和string没有本质不同,只是它为内置的string类型增加了三个新方法Len() Less() Swap()。 这样实现了ByLength后,三个方法也就实现了。也就是inteface 接口,接口就是一个方法签名的集合。所谓方法签名,就是指方法的声明,只要实现该接口定义的所有方法即可实现该接口。所以上面的三个过程实现了一个interface接口的功能。也就是说,类型通过实现一个接口的所有方法可以实现该接口,但上例子的接口是隐式的,没有明确的定义出来,这种隐式接口的实现可以出现在任何包中,无需提前准备。因此,也就无需在每一个实现上增加新的接口名称。
事实上,在GO的标准包内该接口是这样的,我们来看对应标准包sort.Sort的定义:
func sort.Sort
由此可以看到,正是Len() Less() Swap()三个方法构成了Sort 的 接口。
这里我们的侧重点还是放在函数、过程、对象、方法上,对象是受体即s;过程就是施加于对象的方法,即施加于s上的Len() Less() Swap()三个方法,这三个方法实现了对象s的长度、大小、位置的交换;方法即是函数,是解决问题的单元,是一组输入和输出的映射。整个过程当输入一组string后,通过过程(三个方法即接口),实现我们期望的目的。
不要只讲理论了,我们要达到自定义排序的功能,只还需下面的几行代码即可:
下面来实现一下:
11 func main() {
12 paixu := []string{"sdsd", "a", "dfdfdf","tffdgg","ewqqqfdf"}
13 sort.Sort(ByLength(paixu))
14 fmt.Println(paixu)
15 }
(上面的15行代码前还需导入两个包“fmt”“sort”)
输出结果:
输出结果
把string{"sdsd", "a", "dfdfdf","tffdgg","ewqqqfdf"}5个值按照长度的大小进行了排序,也就是实现了自定义排序的功能。
领取专属 10元无门槛券
私享最新 技术干货