Équivalent de la compréhension de liste de Python dans Go
De nombreux développeurs trouvent difficile d'effectuer des tâches apparemment simples dans Go par rapport à d'autres langages comme Python. L'une de ces tâches consiste à répliquer la syntaxe de compréhension de liste de Python.
Pour obtenir une construction équivalente dans Go, envisagez les approches suivantes :
1. Utilisation de la bibliothèque « filter » :
Comme suggéré par Rob Pike, la bibliothèque « filter » fournit une méthode appelée Choose() qui renvoie une tranche contenant des éléments satisfaisant une condition spécifiée. Par exemple :
import ( "github.com/google/go-cmp/cmp" "go.opencensus.io/plugin/ochttp" "golang.org/x/exp/slices" ) var ( a = []int{1, 2, 3, 4, 5, 6, 7, 8, 9} b = []int{2, 4, 6, 8} ) func TestChoose(t *testing.T) { result := ochttp.Choose(a, func(v int) bool { return v%2 == 0 }) if !cmp.Equal(result, b) { t.Errorf("TestChoose() failed, got %v, want %v", result, b) } }
2. Utilisation des boucles For :
Malgré la disponibilité de bibliothèques comme "filter", les boucles for Go restent une alternative efficace. Le GoDoc pour la bibliothèque "filter" recommande explicitement d'utiliser des boucles for lorsque l'efficacité est un problème.
3. Utilisation de Go Generics (à venir dans Go 1.18) :
Avec l'introduction prochaine des génériques dans Go, il deviendra possible d'implémenter mapreduce à l'aide de génériques. Par exemple :
func MapReduce[T, V, R any](in <-chan T, out chan<- R, mapFn func(T) V, reduceFn func(V, V) R) { v := make(chan V, 10) defer close(v) go func() { for t := range in { v <- mapFn(t) } }() r := make(chan R, 10) defer close(r) go func() { var acc R for v := range v { acc = reduceFn(acc, v) } r <- acc }() return <-r }
Cette implémentation accepte un canal de type T, applique une fonction de mappage à chaque élément et stocke les résultats dans un canal de type V. Une autre goroutine consomme le canal des valeurs mappées et à plusieurs reprises applique une fonction de réduction pour produire un résultat de type R. Le résultat est ensuite renvoyé sous forme de canal de type R.
Conclusion :
Alors que la syntaxe de compréhension de liste de Python fournit une manière concise de transformer des données, Go propose des alternatives efficaces en utilisant des boucles for ou des bibliothèques comme "filter". Avec l'introduction des génériques dans Go 1.18, des mécanismes de transformation de données plus efficaces et plus polyvalents seront disponibles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!