第11节 Go语言特性代码展示与新特性泛型

❤️💕💕Go语言高级篇章,在此之前建议您先了解基础和进阶篇。Myblog:http://nsddd.topopen in new window

Go语言基础篇open in new window

Go语言100篇进阶open in new window


[TOC]

Go18

go 1.18 的正式版(go version go1.18 windows/amd64 ),今天我们就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内声明int64float64的合集

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

END 链接