GO中的“泛型”?

Golang不支持通常的相似Java中的标记式泛型。不少人所以而十分不满,认为没有泛型增长了不少工做量。而目前因为泛型支持的复杂性,Golang的设计和实现者并无把这个泛型支持做为紧急须要增长的特性。可是,若是真的没有泛型,就必定不行了么?答案固然是否认的。没有泛型也能够,并且我以为代码更简单,直接,有趣(我的观点,勿喷)。java

咱们这里打算以一些例子来说解Golang中如何处理这个问题。数组

首先,咱们看一个冒泡排序的问题。针对整型数组切片的排序。函数

package main

import (
	"fmt"
)

func bubbleSort(array []int) {
	for i := 0; i < len(array); i++ {
		for j := 0; j < len(array)-i-1; j++ {
			if array[j] > array[j+1] {
				array[j], array[j+1] = array[j+1], array[j]
			}
		}
	}
}

func main() {
	a1 := []int{3, 2, 6, 10, 7, 4, 6, 5}
	bubbleSort(a1)
	fmt.Println(a1)
}

在线运行地址:https://www.bytelang.com/o/s/c/H8uLEIC6dA0=测试

 

上面的例子输出为:spa

[2 3 4 5 6 6 7 10]

那么,咱们若是但愿这个bubbleSort可以同时支持float类型数据排序,或者是按照字符串的长度来排序应该怎么作呢?在其余的例如java语言中,咱们能够将bubbleSort定义为支持泛型的排序,可是Go里面就不行了。为了达到这个目的,咱们可使用interface来实现相同的功能。.net

针对上面的排序问题,咱们能够分析一下排序的步骤:设计

  1. 查看切片长度,以用来遍历元素(Len);
  2. 比较切片中的两个元素(Less);
  3. 根据比较的结果决定是否交换元素位置(Swap)。
    到这里,或许你已经明白了,咱们能够把上面的函数分解为一个支持任意类型的接口,任何其余类型的数据只要实现了这个接口,就能够用这个接口中的函数来排序了。
type Sortable interface{
	Len() int
	Less(int, int) bool
	Swap(int, int)
}

下面,咱们就用几个例子来描述一下这个接口的用法。code

 

package main

import (
	"fmt"
)

type Sortable interface {
	Len() int
	Less(int, int) bool
	Swap(int, int)
}

func bubbleSort(array Sortable) {
	for i := 0; i < array.Len(); i++ {
		for j := 0; j < array.Len()-i-1; j++ {
			if array.Less(j+1, j) {
				array.Swap(j, j+1)
			}
		}
	}
}

//实现接口的整型切片
type IntArr []int

func (array IntArr) Len() int {
	return len(array)
}

func (array IntArr) Less(i int, j int) bool {
	return array[i] < array[j]
}

func (array IntArr) Swap(i int, j int) {
	array[i], array[j] = array[j], array[i]
}

//实现接口的字符串,按照长度排序
type StringArr []string

func (array StringArr) Len() int {
	return len(array)
}

func (array StringArr) Less(i int, j int) bool {
	return len(array[i]) < len(array[j])
}

func (array StringArr) Swap(i int, j int) {
	array[i], array[j] = array[j], array[i]
}

//测试
func main() {
	intArray1 := IntArr{3, 4, 2, 6, 10, 1}
	bubbleSort(intArray1)
	fmt.Println(intArray1)

	stringArray1 := StringArr{"hello", "i", "am", "go", "lang"}
	bubbleSort(stringArray1)
	fmt.Println(stringArray1)
}

在线运行地址:https://www.bytelang.com/o/s/c/J_thL5dPXxI=排序

 

输出结果为:接口

[1 2 3 4 6 10]
[i am go lang hello]

上面的例子中,咱们首先定义了一个IntArr类型的整型切片类型,而后让这个类型实现了Sortable接口,而后在测试代码中,这个IntArr类型就能够直接调用Sortable接口的bubbleSort方法了。

另外,咱们还演示了一个字符串切片类型StringArr按照字符串长度来排序的例子。和IntArr类型同样,它实现了Sortable便可定义的方法,而后就能够用Sortable便可的bubbleSort方法来排序了。

总结 上面的例子,是一种Golang中支持所谓的“泛型”的方法。这种泛型固然不是真正意义上面的泛型,可是提供了一种针对多种类型的一致性方法的参考实现。

相关文章
相关标签/搜索