go 1.18
后面才有的内容
更详细的推荐下面这篇文章:
Go 1.18 泛型全面讲解:一篇讲清泛型的全部
按照往常我们用interface
实现不同类型的参数接收,但是我们需要对它类型断言判断,如果有多种不同类型参数,那么我们就要多个if
判断,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package main
import "fmt"
func main() { printArray([]string{"hello", "world"}) printArray([]int{1, 2}) }
func printArray(arr interface{}) { for _, a := range arr.([]string) { fmt.Println(a) } }
|
现在我们多了泛型,可以大大的简化这个过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package main
import "fmt"
func main() { printArray([]string{"hello", "world"}) printArray([]int{1, 2}) printParam(3.14) printParam("666") }
func printArray[T string | int](arr []T) { for _, a := range arr { fmt.Println(a) } }
func printParam[T string | int | float64](p T) { fmt.Printf("%v %T\n", p, p) }
|
内置的泛型 any
和 comparable
any
: 表示go里面所有的内置基本类型,等价于interface{}
comparable
: 表示go里面所有内置的可比较类型–> int,uint,float,bool,struct,指针
等一切可以比较的类型
1 2 3 4 5
| func printArray[T any](arr []T) { for _, a := range arr { fmt.Println(a) } }
|
总结:泛型的作用
泛型减少重复代码并提高类型的安全性
泛型最佳适配场合