Go 1.18 新特性尝鲜:泛型

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值