Есть ли встроенная функция 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).

Несколько советов по улучшению кода:

  1. MinIntSlice вернет 0 для пустого среза. Однако 0 также является допустимым min-элементом. Я думаю, что вызов паники на пустой кусочек - лучший вариант.

  2. Использовать петлю диапазона:

    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 ответа

  1. Использовать петлю диапазона:

    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]
}