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

时间:2015-12-14 04:30:28

标签: 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
}

OR可变数量的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
}

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

7 个答案:

答案 0 :(得分:23)

没有内置功能。

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

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

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

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

  2. 使用范围循环:

    for i, e := range v {
        if i==0 || e < m {
            m = e
        }
    }
    
  3. 通过不给出值的索引,它将给出最小值0,这可能不会出现在给定值中,因此您还必须对索引应用条件。

答案 1 :(得分:2)

This package包含用于单独的值或切片的MinMax函数的某些实现。在go get之后,它可以像这样使用:

import (
    "fmt"
    "<Full URL>/go-imath/ix" // Functions for int type
)
...
fmt.Println(ix.Min(100, 152)) // Output: 100
fmt.Println(ix.Mins(234, 55, 180)) // Output: 55
fmt.Println(ix.MinSlice([]int{2, 29, 8, -1})) // Output: -1

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

正如@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
}

由此解决了空切片的问题:出现运行时错误(index out of range

答案 4 :(得分:0)

通过排序,它可以更短:

func MinIntSlice(v []int) int {
  sort.Ints(v)
  return v[0]
}

func MaxIntSlice(v []int) int {
  sort.Ints(v)
  return v[len(v)-1]
}

但不要忘记根据您的口味将其修改为零长度的切片。

答案 5 :(得分:0)

使用@kostya的answer

  1. 使用范围循环:

    for i, e := range v {
        if i==0 || e < m {
            m = e
        }
    }
    

通过不给出值的索引,它将为您提供最小值0,该最小值可能不存在于给定的值中

答案 6 :(得分:0)

如果您不在乎输入数组

import . "sort"
func MinIntSlice(v []int){
    Ints(v)
    return z[0]
}

func MaxIntSlice(v []int){
    Ints(v)
    return z[len(v)-1]
}
// and MinMax version
func MinMax(v []int)(int,int){
    Ints(v)
    return z[0],z[len(v)-1]
}