web-dev-qa-db-fra.com

Existe-t-il une fonction intégrée dans min pour une tranche d'arguments int ou un nombre variable d'arguments int dans golang?

Précurseur: Je commence tout juste à me mouiller le golang. 

Cela peut sembler une question idiote, car il est assez facile de faire ces calculs, mais je vais le poser quand même car je n’ai pas trouvé de réponse lors de la recherche sur Google. 

Existe-t-il une fonction intégrée qui renvoie le minimum d'une tranche d'arguments 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
}

OU le minimum d'un nombre variable d'arguments 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
}

Sinon, la meilleure "convention" consiste-t-elle simplement à créer un paquet contenant de tels assistants?

14
Jesse

Il n'y a pas intégré pour cela. 

Si vous avez besoin de cette fonctionnalité dans un seul package, vous pouvez écrire une fonction non exportée (par exemple minIntSlice). 

Si vous avez besoin de cette fonctionnalité dans plusieurs packages, vous pouvez créer un package et y placer des fonctions similaires. Vous devriez envisager de rendre ce paquet interne ( https://golang.org/s/go14internal ).

Quelques suggestions pour améliorer votre code:

  1. MinIntSlice retournera 0 pour une tranche vide. Cependant, 0 est également un élément min valide. Je pense qu’appeler la panique sur une tranche vide est une meilleure option.

  2. Utiliser la boucle de distance:

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

en ne donnant pas l'indice de valeur, cela vous donnera la valeur minimale 0, qui peut ne pas être présente dans les valeurs données, de sorte que vous devez également appliquer la condition sur l'indice.

21
kostya

Avec le tri, cela peut être plus court:

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

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

Mais n'oubliez pas de le modifier pour obtenir des tranches de longueur nulle à votre goût.

2
Yury Alexandrov

Comme @kostya a correctement déclaré qu'il n'y a pas de fonction min ou max intégrée dans Golang. 

Cependant, je suggérerais une solution légèrement différente:

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
}

Avec cela, le problème d'une tranche vide est résolu: une erreur d'exécution apparaît (index out of range)

1
Michael Dorner

Utilisation de @ kostya's answer

  1. Utiliser la boucle de distance:

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

en ne donnant pas l'indice de valeur, cela vous donnera la valeur minimale 0, qui peut ne pas être présente dans les valeurs données

0
Irrfan23