Pipelines en Go
Cada etapa lee un canal y devuelve otro, así que las etapas se componen.
func generate(limit int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for i := 1; i <= limit; i++ {
out <- i
}
}()
return out
}
func square(in <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for value := range in {
out <- value * value
}
}()
return out
}
func sumPipeline(limit int) int {
total := 0
for value := range square(generate(limit)) {
total += value
}
return total
}
Cómo funciona
- Cada etapa cierra el canal que le pertenece.
- Las etapas corren en concurrente, así que el trabajo se superpone.
- El range final drena la última etapa.
Palabras clave y builtins usados aquí
chanclosedeferforfuncgointmakerangereturn
El intento, en números
- Líneas
- 29
- Caracteres a escribir
- 425
- Tokens
- 126
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 69 segundos.
Paso 4 de 5 en Patrones; paso 22 de 25 en Concurrencia.