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?
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:
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.
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.
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.
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
)
Utilisation de @ kostya's answer
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