我正在探索 go 泛型(1.18 beta),并且有与比较两个数值相关的问题(一种接受两个值并返回更大数字的简单方法)。
为此,我正在创建一个涵盖此类型集的自定义数字类型(在函数中getBiggerNumber):
int | int8 | int16 | int32 | int64 | float32 | float64
Run Code Online (Sandbox Code Playgroud)
然而,又添加了一个函数,但这一次没有使用自定义类型,而是使用了comparable内置约束(在函数中getBiggerNumberWithComparable)。
但下面的代码给出了此方法的错误:
“无效操作:无法比较 t1 > t2(运算符 > 未在 T 上定义)”?
知道为什么该>操作不适用于内置的可比较类型吗?
package main
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 { // ./generics-sample.go:17:5: invalid operation: cannot compare t1 > t2 (operator > not defined on T)
return t1
}
return t2
}
func main() {
fmt.Println(getBiggerNumber(2.5, -4.0))
fmt.Println(getBiggerNumberWithComparable(2.5, -4.0))
}
Run Code Online (Sandbox Code Playgroud)
bla*_*een 41
comparable==是支持相等运算符和的类型的约束!=。语言规范在类型约束中定义了这一点。
值得注意的是,这包括可以用作映射键的任何内容,包括具有可比较字段的数组和结构。(在 Go 1.20 之前,比较可能在运行时出现恐慌的类型(例如接口)被排除)。
确实,在Go语言规范中,比较运算符包括顺序运算符(<, >, <=, >=)。这种术语的选择可能会让您感到困惑。然而,规格也消除了歧义:
相等运算符
==和适用于可比较的!=操作数。排序运算符、、、和适用于已排序的操作数。<<=>>=
cmp.Ordered从标准库中使用。
新的 cmp 包定义了类型约束 Ordered 和两个新的通用函数 Less 和 Compare,它们对于有序类型很有用。
在 Go 1.18 中,支持顺序运算符(例如>和 )的可用约束<是1:constraints.Ordered
type Ordered interface {
Integer | Float | ~string
}
Run Code Online (Sandbox Code Playgroud)
1:请注意,该包golang.org/x/exp是实验性的。它的内容不保证与新的 Go 版本向后兼容,但您始终可以将所需的定义复制粘贴到您自己的代码中