python - language - lenguaje go
Equivalente de Golang para la lista de comprensiĆ³n de Python (2)
Estoy jugando con Go pero me cuesta mucho hacer cosas que son muy simples en otros idiomas.
Me gustaría reproducir una sintaxis similar:
array = [a for a in anotherArray if (some condition)]
¿Qué es una forma elegante de hacerlo en Go? Realmente me gustaría simplificar mi código, especialmente cuando uso la función en una matriz. Por ejemplo:
min = min(abs(a[i], b[j]) for i in range(n)
for j in range(i, n))
Muchas gracias
Curiosamente, Rob Pike acaba de proponer (hace 18 horas) el filter biblioteca que hace un poco de lo que quieres:
// Choose takes a slice of type []T and a function of type func(T) bool. (If
// the input conditions are not satisfied, Choose panics.) It returns a newly
// allocated slice containing only those elements of the input slice that
// satisfy the function.
func TestChoose(t *testing.T) {
a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
expect := []int{2, 4, 6, 8}
result := Choose(a, isEven)
Como twotwotwo
señala en los comentarios , el GoDoc para esta biblioteca establece:
El
filter
paquetes contiene funciones de utilidad para filtrar segmentos a través de la aplicación distribuida de una función de filtro.El paquete es un experimento para ver lo fácil que es escribir esas cosas en Go. Es fácil, pero
for
bucles son igual de fáciles y más eficientes .No debe utilizar este paquete.
Esta advertencia se refleja en el documento " Resumen de las discusiones de los genéricos de Go ", sección " Código funcional ":
Estas son las funciones usuales de orden superior , como
map
,reduce
(fold
),filter
,zip
, etc.Casos :
Transformaciones de datos de tipo seguro:map
,fold
,zip
Pros para el uso de genéricos :
Manera concisa de expresar transformaciones de datos.Contras para el uso de genéricos :
La solución más rápida debe tener en cuenta cuándo y en qué orden aplicar esas transformaciones y la cantidad de datos que se generan en cada paso.
Es más difícil de leer para los principiantes.Soluciones alternativas :
uso
for
bucles y construcciones de lenguaje habituales .
Si lo que estás buscando es, de hecho, la comprensión de la lista de python, no hay tal equivalente sintáctico en ir AFAIK.
La forma de hacerlo es crear una función que tome una porción y una función (para probar la condición) y devuelva una nueva porción.
EDITAR: Bueno, parece que ya existe una característica en Go. cf VonC