在 Go 1.22.1 中使用内置函数“max”时出现编译错误:“无效操作:对内置 max 无效使用...”

问题描述 投票:0回答:1

我想使用 max 来获取切片中的最大值,我查看了 max 的函数声明:

func max[T cmp.Ordered](x T, y ...T) T
但尽管它和我的“myMax”声明相同,它还是报了编译错误,这让我很困惑。

这是我的代码:

package main

import (
    "cmp"
    "fmt"
)

func maxSubArray(nums []int) int {
    dp := make([]int, len(nums))
    dp[0] = nums[0]
    for i := 1; i < len(nums); i++ {
        dp[i] = max(dp[i-1]+nums[i], nums[i])
    }
    return myMax(dp[0], dp[1:]...) // all going well
    //return max(dp[0], dp[1:]...) // compilation error:invalid operation: invalid use of ... with built-in max
}

func myMax[T cmp.Ordered](a T, b ...T) T {
    res := a
    for _, v := range b {
        if v > res {
            res = v
        }
    }
    return res
}

func main() {
    nums := []int{-2, 1, -3, 4, -1, 2, 1, -5, 4}
    s := maxSubArray(nums)
    fmt.Println(s)
}

在编写代码时,我使用相同的签名编写了 myMax,并且运行良好。

我知道如果我将切片作为变量传递,它将在不生成新切片的情况下使用它,所以我认为它可以与 max 一起正常工作,但它无法编译。

当然我也知道slice是没有可比性的(除了nil)。

// 抱歉我的英语不好。

go slice built-in
1个回答
0
投票

来自 文档(强调已添加):

max 内置函数返回 cmp.Ordered 类型参数的固定数量的最大值。

max 不支持 ... 运算符。请注意,max 不是一个函数,而是一个内置函数。函数的一般规则不适用于内置函数。

© www.soinside.com 2019 - 2024. All rights reserved.