重大变化:Go 1.18将移除用于泛型的constraints包

时间:2024-10-10 19:08:26

Go 1.18将移除用于泛型的constraints包

背景

Go官方团队在Go 1.18 Beta 1版本的标准库里因为泛型设计而引入了contraints包。

 

constraints包里定义了SignedUnsigned, Integer, Float, ComplexOrdered共6个interface类型,可以用于泛型里的类型约束(type constraint)。

比如我们可以用constraints包写出如下泛型代码:

// 
package main
​
import (
  "constraints"
  "fmt"
)
​
// return the min value
func min[T ](a, b T) T {
  ("%T ", a)
  if a < b {
    return a
  }
  return b
}
​
func main() {
  minInt := min(1, 2)
  (minInt)
​
  minFloat := min(1.0, 2.0)
  (minFloat)
​
  minStr := min("a", "b")
  (minStr)
}

函数min是一个泛型函数,接收2个参数,返回其中的较小者。

类型参数T的类型约束的定义如下:

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,