这个问题已经有答案了:
In Go generics, why can't I use comparable constraint with order operators?(1个答案)
上个月关门了。
package main
import (
"fmt"
)
func findMinMax[T comparable](arr []T) (min, max T) {
for _, v := range arr {
if v > max {
max = v
} else if v < min {
min = v
}
}
return min, max
}
func main() {
arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println(findMinMax(arr))
}
我非常乐意帮助您解决在findMinMax函数中遇到的问题。错误消息表明v > max或v < min表明函数中的比较操作可能存在问题。为了提供一个精确的解决方案,我需要查看findMinMax函数的实现。根据您的描述,似乎是应该具有可比性的类型T在比较过程中导致了问题。
我希望findMinMax函数能够正常工作。
1条答案
按热度按时间yhxst69z1#
您对
T
类型参数使用了comarable
约束。comparable
表示:* 可比 *。因此,您可以对该类型的值使用==
运算符。这并不意味着它们是 * 有序的 *,这是使用<
>
运算符所必需的。有序约束在
golang.org/x/exp/constraints
包中定义,参见constraints.Ordered
。使用你的代码编译:
在Go Playground上试试。
但是它给出了错误的结果,因为你从它们的零值开始
min
和max
,如果传递的切片中的所有值都大于或小于零值,min
或max
将保持零值。一个简单的修复方法是,如果传入的切片不为空,则使用第一个值初始化
min
和max
:这将输出(在Go Playground上尝试):
注意,如果你使用浮点类型,你必须显式处理
NaN
值,因为它们对其他浮点数的顺序没有指定。