Go

iter.Seq — Range-Over-Func (Go 1.23+)

admin by @admin ADMIN
40m ago
May 31, 2026
Public
0 0 up · 0 down Sign in to vote
Go 1.23 added "range over func" — your own functions can produce values that work with `for v := range fn`. Cleaner than channels for in-process iteration without goroutine overhead.
Go
Raw
package main

import (
    "fmt"
    "iter"
)

// Yield every Fibonacci up to (but not including) max
func Fib(max int) iter.Seq[int] {
    return func(yield func(int) bool) {
        a, b := 0, 1
        for a < max {
            if !yield(a) { return }              // consumer broke out
            a, b = b, a+b
        }
    }
}

// Pair-yielding version (Seq2)
func Enumerate[T any](s []T) iter.Seq2[int, T] {
    return func(yield func(int, T) bool) {
        for i, v := range s {
            if !yield(i, v) { return }
        }
    }
}

func main() {
    for n := range Fib(100) {
        fmt.Print(n, " ")                        // 0 1 1 2 3 5 8 13 21 34 55 89
    }
    fmt.Println()

    for i, name := range Enumerate([]string{"a", "b", "c"}) {
        fmt.Printf("%d=%s ", i, name)             // 0=a 1=b 2=c
    }
}
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.