6 votes

Existe-t-il un moyen de mapper un tableau d'objets en golang ?

Venant de Nodejs, je pourrais faire quelque chose comme :

// given an array `list` of objects with a field `fruit`:

fruits = list.map(el => el.fruit) # which will return an array of fruit strings 

Y a-t-il un moyen de faire cela dans un one liner élégant en golang ?

Je sais que je peux le faire avec une boucle d'intervalle, mais je cherche la possibilité d'une solution unique.

14voto

Jubobs Points 1246

En Go, les tableaux sont peu flexibles (car leur longueur est encodée dans leur type) et coûteux à passer aux fonctions (car une fonction opère sur une copie de ses arguments de tableau). Je suppose que vous aimeriez opérer sur tranches plutôt que sur des tableaux.

Parce que les méthodes ne peuvent pas prendre d'arguments de type supplémentaires vous ne pouvez pas simplement déclarer un générique Map méthode en Go. Cependant, vous pouvez définir Map en tant que générique fonction supérieure :

func Map[T, U any](ts []T, f func(T) U) []U {
    us := make([]U, len(ts))
    for i := range ts {
        us[i] = f(ts[i])
    }
    return us
}

Vous pouvez alors écrire le code suivant,

names := []string{"Alice", "Bob", "Carol"}
fmt.Println(Map(names, utf8.RuneCountInString))

qui imprime [5 3 5] vers stdout (essayez-le dans ce terrain de jeu ).


Go 1.18 a vu l'ajout de a golang.org/x/exp/slices paquet qui permet d'effectuer de nombreuses opérations pratiques sur les tranches. Map en est notablement absente. L'omission de cette fonction a été le résultat d'une longue discussion au sein de l'équipe de l Numéro de GitHub dédié à la golang.org/x/exp/slices proposition ; les préoccupations étaient notamment les suivantes :

Russ Cox en fin de compte, a choisi d'abandonner Map de la proposition parce que c'est

Il est probablement préférable de l'intégrer dans une API de flux plus complète, située ailleurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X