Go 1.18 新特性尝鲜:泛型
引言
GO 团队在今天发布了 go 1.18 的正式版,今天我们就GO的新特性:泛型 进行简单的尝鲜使用。
GO 中泛型涉及到两个关键词:类型参数、类型约束
GO 中泛型的语法
以下示例中 []
类型参数type0、type2
,其中type0
受可比较类型约束 ,type1
受 int64 或 float64 类型约束。
func funcName[type0 comparable, type1 int64 | float64](arg0 type0, arg1 type1) {}
泛型使用
基本使用
该函数内部打印每个参数的类型和值
func main() {
funcName("arg0", 1)
funcName("arg0", 3.5)
}
func funcName[type0 comparable, type1 int | float64](arg0 type0, arg1 type1) {
fmt.Printf("arg0 type: %T value: %v\t", arg0, arg0)
fmt.Printf("arg1 type: %T value: %v\n", arg1, arg1)
}
结果:
arg0 type: string value: arg0 arg1 type: int value: 1
arg0 type: string value: arg0 arg1 type: float64 value: 3.5
Go泛型 若存在违反泛型函数中的类型约束,能够在编译时捕获
我们尝试给funcName 函数的第二个参数传如string字面量
func main(){
funcName("arg0", "string")
}
编译结果:
# command-line-arguments
.\test_1.go:9:10: string does not implement int|float64
指定类型参数调用
指定类型参数-在方括号内的类型名称-来明确你所调用的函数中应该用哪些类型来替代类型参数
func main(){
funcName[string, int]("arg0", 4)
}
通过interfac进行类型约束
类型约束可以通过interface
进行绑定
- 声明一个Number interface类型作为类型限制
- 在interface内声明int64和float64的合集
type Number interface {
float64 | int
}
修改实例函数 arg1 类型参数的类型约束为接口 Number
func main() {
funcName("arg0", 1)
funcName("arg0", 3.5)
}
func funcName[type0 comparable, type1 Number](arg0 type0, arg1 type1) {
fmt.Printf("arg0 type: %T value: %v\t", arg0, arg0)
fmt.Printf("arg1 type: %T value: %v\n", arg1, arg1)
}
执行结果
arg0 type: string value: arg0 arg1 type: int value: 1
arg0 type: string value: arg0 arg1 type: float64 value: 3.5