前言
在 go1.18
推出泛型,了解其基本语法后,对之前的代码进行了泛型重构。最近比较空,准备再优化下泛型相关的代码,在浏览源码的时候,发现包 golang.org/x/exp/constraints
中有个奇怪的东西(~
),如下:
type Ordered interface {
Integer | Float | ~string
}
这种写法了解,就是泛型的语法,自定义类型约束可直接聚合,但是这个 ~string
是个啥?刚看到时还以为是 IDE
添加的什么辅助显示,并不是真的字符 =-=。
解释
~int, ~string
等各种类型前添加一个波浪线 ~
,表示的是衍生类型,即使用 type
自定义的类型也可以被识别到(type MyInt int
),底层类型一致即可。
示例
下面示例提供了一个 min
方法求最小值,自定义了 MyInt
和 MyInt1
类型,执行泛型方法,可见都能正确输出返回值。
package main
import (
"fmt"
"golang.org/x/exp/constraints"
)
type MyInt = int
type MyInt1 int
func min[T constraints.Ordered](a, b T) T {
if a < b {
return a
}
return b
}
func min1[T ~int](a, b T) T {
if a < b {
return a
}
return b
}
func main() {
fmt.Println(min(MyInt(1), MyInt(2)))
fmt.Println(min1(MyInt1(1), MyInt1(2)))
}
总结
本篇介绍泛型中一个小小的特性 ~
, 这种类型前添加波浪线的写法,表示的是衍生类型,即使用 type
自定义的类型也可以被识别到(type MyInt int
),底层类型一致即可,主要同泛型一起使用。
通常在使用这种需要排序的类型时,直接使用 go
官方提供的包 golang.org/x/exp/constraints
即可。