前驱:我刚开始用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
}
或者可变数量的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
}
如果没有,最简单的“约定”是创建一个包含这样的帮助器的包吗?
这里没有内置功能。
如果只在一个包中需要此功能,则可以编写未导出的函数(例如minIntSlice
)。
如果您需要在多个包中使用此功能,则可以创建包并在其中放置类似的功能。你应该考虑让这个包内部(https://golang.org/s/go14internal)。
一些如何改进代码的建议:
MinIntSlice
将返回0表示空切片。但是0也是有效的min元素。我认为在空切片上调用恐慌是一个更好的选择。for i, e := range v {
if i==0 || e < m {
m = e
}
}
通过不给出值的索引,它将给出最小值0,这可能不存在于给定值中,因此您还必须对索引应用条件。
正如@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
)
通过排序,它可以更短:
func MinIntSlice(v []int) int {
sort.Ints(v)
return v[0]
}
func MaxIntSlice(v []int) int {
sort.Ints(v)
return v[len(v)-1]
}
但不要忘记根据您的口味修改零长度切片。
使用@ kostya的answer
for i, e := range v {
if i==0 || e < m {
m = e
}
}
通过不给出值的索引,它将给出最小值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]
}