Go 1.18将移除用于泛型的constraints包
背景
Go官方团队在Go 1.18 Beta 1版本的标准库里因为泛型设计而引入了contraints
包。
constraints
包里定义了Signed
,Unsigned
, Integer
, Float
, Complex
和Ordered
共6个interface类型,可以用于泛型里的类型约束(type constraint
)。
比如我们可以用constraints
包写出如下泛型代码:
// test.go
package main
import (
"constraints"
"fmt"
)
// return the min value
func min[T constraints.Ordered](a, b T) T {
fmt.Printf("%T ", a)
if a < b {
return a
}
return b
}
func main() {
minInt := min(1, 2)
fmt.Println(minInt)
minFloat := min(1.0, 2.0)
fmt.Println(minFloat)
minStr := min("a", "b")
fmt.Println(minStr)
}
函数min
是一个泛型函数,接收2个参数,返回其中的较小者。
类型参数T
的类型约束contraints.Ordered
的定义如下:
type Ordered interface {
Integer | Float | ~string
}
上面代码的执行结果为:
int 1
float64 1
string a
备注:如果对Go泛型和constraints
包还不太了解的同学,可以翻看我之前写的一文读懂Go泛型设计和使用场景。
现状
Go官方团队的技术负责人Russ Cox在2022.01.25提议将constraints
包从Go标准库里移除,放到x/exp
项目下。Russ Cox给出的理由如下:
There are still questions about the the constraints package. To start with, although many people are happy with the name,