Go语言 无效操作:v > max(类型参数T与>不可比较)[重复]

dfty9e19  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(95)

这个问题已经有答案了

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函数能够正常工作。

yhxst69z

yhxst69z1#

您对T类型参数使用了comarable约束。comparable表示:* 可比 *。因此,您可以对该类型的值使用==运算符。这并不意味着它们是 * 有序的 *,这是使用<>运算符所必需的。
有序约束在golang.org/x/exp/constraints包中定义,参见constraints.Ordered
使用你的代码编译:

import (
    "fmt"

    "golang.org/x/exp/constraints"
)

func findMinMax[T constraints.Ordered](arr []T) (min, max T) {
    for _, v := range arr {
        if v > max {
            max = v
        } else if v < min {
            min = v
        }
    }
    return min, max
}

Go Playground上试试。
但是它给出了错误的结果,因为你从它们的零值开始minmax,如果传递的切片中的所有值都大于或小于零值,minmax将保持零值。
一个简单的修复方法是,如果传入的切片不为空,则使用第一个值初始化minmax

func findMinMax[T constraints.Ordered](arr []T) (min, max T) {
    if len(arr) > 0 {
        min, max = arr[0], arr[0]
    }

    for _, v := range arr {
        if v > max {
            max = v
        } else if v < min {
            min = v
        }
    }
    return min, max
}

这将输出(在Go Playground上尝试):
注意,如果你使用浮点类型,你必须显式处理NaN值,因为它们对其他浮点数的顺序没有指定。

相关问题