Есть ли встроенная функция min для фрагмента аргументов int или переменной числа аргументов int в golang?
Предвестник: Я только начинаю мочить ноги голангом.
Это может оказаться глупым вопросом, так как довольно легко выполнить эти вычисления, но я все равно попрошу об этом, так как я не нашел ответа, когда Googling.
Есть ли встроенная функция, которая возвращает минимум фрагмента аргументов 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
}
Если нет, это лучшее "соглашение" просто для создания пакета, содержащего такие помощники?
Ответы
Ответ 1
Для этого нет встроенного.
Если вам нужна эта функциональность только в одном пакете, вы можете написать minIntSlice
функцию (например, minIntSlice
).
Если вам нужна эта функциональность в нескольких пакетах, вы можете создать пакет и разместить там похожие функции. Вы должны подумать о том, чтобы сделать этот пакет внутренним (https://golang.org/s/go14internal).
Несколько советов по улучшению кода:
-
MinIntSlice
вернет 0 для пустого среза. Однако 0 также является допустимым min-элементом. Я думаю, что вызов паники на пустой кусочек - лучший вариант.
-
Использовать петлю диапазона:
for i, e := range v {
if i==0 || e < m {
m = e
}
}
не указав индекс значения, он даст вам минимальное значение 0, которое может не присутствовать в данных значениях, поэтому вам также нужно применить условие к индексу.
Ответ 2
При сортировке это может быть короче:
func MinIntSlice(v []int) int {
sort.Ints(v)
return v[0]
}
func MaxIntSlice(v []int) int {
sort.Ints(v)
return v[len(v)-1]
}
Но не забудьте изменить его на нулевые фрагменты длины по своему вкусу.
Ответ 3
Как правильно сказано, @kostya нет встроенной функции 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
Использование @kostya ответа
-
Использовать петлю диапазона:
for i, e := range v {
if i==0 || e < m {
m = e
}
}
не указав индекс значения, он даст вам минимальное значение 0, которое может не присутствовать в данных значениях
Ответ 5
если вас не волнует входной массив
import . "sort"
func MinIntSlice(v []int){
Ints(v)
return z[0]
}
func MaxIntSlice(v []int){
Ints(v)
return z[len(v)-1]
}