文章目录
泛型(1.18新特性)
泛型的概念理解
Go语言他是在进化的,不断的迭代,优化功能!
1.0 - 1.19 (1.20)/ 和最开始Go语言比起来发生了很多变化。
1.7 Context
1.11 modules
1.13 error嵌套
1.18 泛型(类型参数)
https://segmentfault.com/a/1190000041634906
泛型的出现,很受期待,但是很少用!场景不多。
打印一个切片(传递不同的参数string 、int)
package main
import (
"fmt"
)
func main() {
is := []int{
1, 2}
//strs := []string{"kuangshen", "xuexiangban"}
printSlice(is)
//printSlice(strs)
}
// 如何实现一个方法可以打印上面不同类型的切片呢? 反射
func printSlice(s interface{
}) {
// 断言 x.(T), 如果x实现了T,那么就将 x转换为T类型
for _, v := range s.([]string) {
fmt.Println(v)
}
}
这种情况,传递的参数进来,需要自己做N种判断来进行适配。
泛型
思考:不限定参数的类型,让调用的人自己去定义类型。
// 参数的类型是不确定的,让用户自己指定。
// 泛型也是使用 [],和数组很像!
//
func printSlice[T any](s []T) {
for _, v := range s {
fmt.Println(v)
}
}
printSlice , [T any]
泛型的约束!由于我们不确定这个函数的参数类型。我们希望用户给我们传递这个值。
print[T string](name T)
print[T string|int](name T)
func Min[T int|int8|int16|int32|int64](a,b T){
}
泛型的作用:
1、减少重复性的代码,提高安全性
- 针对不同的类型,写了相同逻辑的代码,我们就可以通过泛型来简化代码!
2、在1.18版本之前 反射 来实现。 泛型并不能完全取代反射!
泛型:多的多个类型(类型可以是不确定的)
var 变量名 数据类型 = 值
var 变量名 T = 值 // 泛型的逻辑
泛型类型
package main
import "fmt"
// s1 是我们自己定义的类型 ,本质 []int
type s1 []int
type s2 []float64
type s3 []float32
// 我们定义的结构都是一样的,只是它的类型不同,就需要重新定义这么多的类型。
// 思考:是否有一种机制,只定义一个类型就可以代表上面的所有类型?
// 泛型:类型 参数化了! 参数:人为传递的