go中的泛型
go
直到 17 版本才支持正式的泛型,现在还在内测之中,所以嘛..
先来看看正式泛型,mattn/go-generics-example: Example code for Go generics (github.com)
替代是用interface
,也可以,只是略显繁琐。
介绍一下怎么使用
这是一个针对整型切片的冒泡排序
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)