Skip to main content

go中的泛型

go直到 17 版本才支持正式的泛型,现在还在内测之中,所以嘛..

先来看看正式泛型,mattn/go-generics-example: Example code for Go generics (github.com)

替代是用interface,也可以,只是略显繁琐。

介绍一下怎么使用

例子源自GO中的“泛型”? - Go语言中文网 - Golang中文社区 (studygolang.com)

这是一个针对整型切片的冒泡排序

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

下面要把它拓展到所有切片,思路是定义一个接口,将冒泡排序的输入改为这个接口。而不同的切片都实现这个接口,从而冒泡排序就能应用于不同切片。

实现:只要一个切片实现了接口定义的所有方法,那就是实现了这个接口。

// 接口
type Sortable interface {
Len() int
Less(int, int) bool
Swap(int, int)
}
//实现接口的整型切片
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)
}

接下来看一个我自己写的生成二叉树的实例。

type TreeNode struct {
Val interface{}
Left *TreeNode
Right *TreeNode
}

// 生成一颗二叉树,返回根节点的指针
func generateTree(order []interface{}) *TreeNode {
...
}

这里的interface{}可以代指所有的类型,所以相当于any

tree := generateTree([]interface{}{"4", "2", "1", "3", "7", "6"})
printTree(tree)

参考自golang中Any类型使用及空接口中类型查询 - Go语言中文网 - Golang中文社区 (studygolang.com)