我想使用 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)。
// 抱歉我的英语不好。
来自 文档(强调已添加):
max 内置函数返回 cmp.Ordered 类型参数的固定数量的最大值。
max 不支持 ... 运算符。请注意,max 不是一个函数,而是一个内置函数。函数的一般规则不适用于内置函数。