contraintsconstraintsSignedUnsignedIntegerFloatComplexOrderedtype constraintconstraints
// 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给出的理由如下:
func(context.Context)func(othercontext.Context)
该提议也同Go语言发明者Rob Pike, Robert Griesemer和Ian Lance Taylor做过讨论,得到了他们的同意。
其中Robert Griesemer和Ian Lance Taylor是Go泛型的设计者。
Russ Cox将这个提议在GitHub公布后,社区成员没有反对意见,因此在2022.02.03这个提议得到正式通过。
不过值得注意的是,2022.01.31发布的Go 1.18 Beta 2版本里还保留了
constraints
包,不建议大家再去使用。
备注:
golang.org/xgolang.org/xgo getgolang.org/x/exp

移除原因 支持泛型的Go 1.18 Beta 1版本发布以来,围绕着
constraints
包的争议很多。
主要是以下因素,导致Russ Cox决定从Go标准库中移除
constraints
包。
constraintsanycomparableconstaintsconstraints.OrderedOrderedanycomparableconstraints

总结 建议不要使用
constraints
包,毕竟Go 1.18正式版本会去掉。
我写了2篇Go泛型入门的教程,欢迎大家参考
  • 官方教程:Go泛型入门
  • 一文读懂Go泛型设计和使用场景

好文推荐
  • Go Quiz: Google工程师的Go语言面试题
  • Go Quiz: 从Go面试题看slice的底层原理和注意事项
  • Go Quiz: 从Go面试题搞懂slice range遍历的坑
  • Go Quiz: 从Go面试题看channel的注意事项
  • Go Quiz: 从Go面试题看channel在select场景下的注意事项
  • Go Quiz: 从Go面试题看defer语义的底层原理和注意事项
  • Go Quiz: 从Go面试题看defer的注意事项第2篇
  • Go Quiz: 从Go面试题看defer的注意事项第3篇
  • Go Quiz: 从Go面试题看分号规则和switch的注意事项

开源地址 文章和示例代码开源在GitHub: Go语言初级、中级和高级教程。
公众号:coding进阶。关注公众号可以获取最新Go面试题和技术栈。
个人网站:Jincheng's Blog。
知乎:无忌。

References
  • https://github.com/golang/go/issues/50792
  • https://github.com/golang/go/issues/50348
  • Sub-repositories - pkg.go.dev