在golang中是否有内置的min函数用于一个int参数或可变数量的int参数?

Jes*_*sse 17 go

前驱:我刚开始用golang弄湿脚.

这可能被证明是一个愚蠢的问题,因为它很容易执行这些计算,但我还是会问它,因为我在谷歌搜索时没有找到答案.

是否有内置函数返回一小部分int参数的最小值:

func MinIntSlice(v []int) (m int) {
    if len(v) > 0 {
        m = v[0]
    }
    for i := 1; i < len(v); i++ {
        if v[i] < m {
            m = v[i]
        }
    }
    return
}
Run Code Online (Sandbox Code Playgroud)

或者可变数量的int参数的最小值:

func MinIntVarible(v1 int, vn ...int) (m int) {
    m = v1
    for i := 0; i < len(vn); i++ {
        if vn[i] < m {
            m = vn[i]
        }
    }
    return
}
Run Code Online (Sandbox Code Playgroud)

如果没有,最简单的"约定"是创建一个包含这样的帮助器的包吗?

kos*_*tya 25

这里没有内置功能.

如果仅在一个包中需要此功能,则可以编写未导出的功能(例如minIntSlice).

如果您需要在多个包中使用此功能,则可以创建包并在其中放置类似的功能.您应该考虑将此包内部(https://golang.org/s/go14internal).

一些如何改进代码的建议:

  1. MinIntSlice将返回0表示空切片.但是0也是有效的min元素.我认为在空切片上调用恐慌是一个更好的选择.

  2. 使用范围循环:

    for i, e := range v {
        if i==0 || e < m {
            m = e
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

不给的值的索引,它会给你的最小值为0,这可能不会出现在给定的值,所以你也必须在申请指标条件.

  • 这是一个有用的反馈。我还没有接触过“范围”。 (3认同)

Jon*_*nas 20

从 Go 开始,1.21现在有内置函数可以获取给定数量的参数的maxmin,以及一个新的slices包来实现与切片相同的功能。

https://go.dev/ref/spec#Min_and_max

min(2, -5, 8, 1.2) // Result: -5
max(2, -5, 8, 1.2) // Result: 8
Run Code Online (Sandbox Code Playgroud)

对于切片,请使用slices包: https: //pkg.go.dev/slices

import "slices"
Run Code Online (Sandbox Code Playgroud)
x := []float64{2, -5, 8, 1.2}
slices.Min(x) // Result: -5
slices.Max(x) // Result: 8
Run Code Online (Sandbox Code Playgroud)


Mic*_*ner 11

正如@kostya 正确指出的那样,Golang 中没有内置的 min 或 max 函数。

但是,我会建议一个稍微不同的解决方案:

func MinMax(array []int) (int, int) {
    var max int = array[0]
    var min int = array[0]
    for _, value := range array {
        if max < value {
            max = value
        }
        if min > value {
            min = value
        }
    }
    return min, max
}
Run Code Online (Sandbox Code Playgroud)

这样就解决了空切片的问题:出现运行时错误 ( index out of range) 并且最大值是免费的。:-)


小智 5

    min := s[0]
    for i :=1; i < len(s); i++ {
        if min > s[i] {
            min = s[i]
        }
    }
Run Code Online (Sandbox Code Playgroud)

min > s[i]? min = s[i] : min