range sobre funciones en Go
Go 1.23 permite hacer range sobre una función: así funcionan los iteradores ahora.
func Countdown(from int) iter.Seq[int] {
return func(yield func(int) bool) {
for n := from; n > 0; n-- {
if !yield(n) {
return
}
}
}
}
func Enumerate[T any](values []T) iter.Seq2[int, T] {
return func(yield func(int, T) bool) {
for i, value := range values {
if !yield(i, value) {
return
}
}
}
}
func use() (int, string) {
sum := 0
for n := range Countdown(4) {
sum += n
}
var last string
for _, value := range Enumerate([]string{"a", "b"}) {
last = value
}
return sum, last
}
Cómo funciona
- Un iterador es una func que toma un callback yield.
- Devolver false desde yield detiene la iteración.
iter.Seqeiter.Seq2nombran las dos formas.
Palabras clave y builtins usados aquí
anyboolforfuncifintrangereturnstringvar
El intento, en números
- Líneas
- 32
- Caracteres a escribir
- 479
- Tokens
- 160
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 87 segundos.
Paso 2 de 2 en Formas de API; paso 18 de 19 en Interfaces y genéricos.