Go 泛型中的可比较约束与有序运算符
在 Go 泛型中,可比较约束限制支持相等运算符(== 和!=),而有序运算符(、=)则需要 Ordered
考虑以下代码:
import "fmt" type numbers interface { int | int8 | int16 | int32 | int64 | float32 | float64 } func getBiggerNumber[T numbers](t1, t2 T) T { if t1 > t2 { return t1 } return t2 } func getBiggerNumberWithComparable[T comparable](t1, t2 T) T { if t1 > t2 { // Compile error return t1 } return t2 } func main() { fmt.Println(getBiggerNumber(2.5, -4.0)) fmt.Println(getBiggerNumberWithComparable(2.5, -4.0)) }
getBiggerNumberWithComparable 中出现错误是因为相当不能保证顺序比较。其中包括不支持排序的映射键类型。
Go 1.18 到 1.20 的解决方案
Go 1.21 之前,使用约束。有序:
import ( "fmt" "golang.org/x/exp/constraints" ) func getBiggerNumberWithOrdered[T constraints.Ordered](t1, t2 T) T { if t1 > t2 { return t1 } return t2 }
Go 解决方案1.21
在 Go 1.21 及更高版本中,使用 cmp.Ordered:
import ( "fmt" "golang.org/x/exp/constraints" "github.com/google/go-cmp/cmp" ) func getBiggerNumberWithOrdered[T cmp.Ordered](t1, t2 T) T { if cmp.Less(t1, t2) { return t2 } return t1 }
以上是Go 泛型中用于类型比较的'comparable”和'Ordered”约束有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!