package main
import (
"fmt"
"time"
)
type Callback func() int
func doSomething() {}
func callbackFactory(i int) Callback {
return func() int {
fmt.Println("callback", i)
return i
}
}
var callbacks []Callback = []Callback{
callbackFactory(1),
callbackFactory(2),
callbackFactory(3),
callbackFactory(4)}
func combiner(iterator chan int) int {
sum := 0
for result := range iterator {
sum += result
if result == 2 {
break
}
}
return sum
}
func main() {
iterator := make(chan int)
go func() {
for _, callback := range callbacks {
doSomething()
iterator <- callback()
}
close(iterator)
fmt.Println("terminate goroutine")
}()
fmt.Println("sum", combiner(iterator))
}
cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImZtdCIKCSJ0aW1lIgopCgp0eXBlIENhbGxiYWNrIGZ1bmMoKSBpbnQKCmZ1bmMgZG9Tb21ldGhpbmcoKSB7fQoKZnVuYyBjYWxsYmFja0ZhY3RvcnkoaSBpbnQpIENhbGxiYWNrIHsKCXJldHVybiBmdW5jKCkgaW50IHsKCQlmbXQuUHJpbnRsbigiY2FsbGJhY2siLCBpKQoJCXJldHVybiBpCgl9Cn0KCnZhciBjYWxsYmFja3MgW11DYWxsYmFjayA9IFtdQ2FsbGJhY2t7CgljYWxsYmFja0ZhY3RvcnkoMSksCgljYWxsYmFja0ZhY3RvcnkoMiksCgljYWxsYmFja0ZhY3RvcnkoMyksCgljYWxsYmFja0ZhY3RvcnkoNCl9CgpmdW5jIGNvbWJpbmVyKGl0ZXJhdG9yIGNoYW4gaW50KSBpbnQgewoJc3VtIDo9IDAKCWZvciByZXN1bHQgOj0gcmFuZ2UgaXRlcmF0b3IgewoJCXN1bSArPSByZXN1bHQKCQlpZiByZXN1bHQgPT0gMiB7CgkJCWJyZWFrCgkJfQoJfQoJcmV0dXJuIHN1bQp9CgpmdW5jIG1haW4oKSB7CglpdGVyYXRvciA6PSBtYWtlKGNoYW4gaW50KQoJZ28gZnVuYygpIHsKCQlmb3IgXywgY2FsbGJhY2sgOj0gcmFuZ2UgY2FsbGJhY2tzIHsKCQkJZG9Tb21ldGhpbmcoKQoJCQlpdGVyYXRvciA8LSBjYWxsYmFjaygpCgkJfQoJCWNsb3NlKGl0ZXJhdG9yKQoJCWZtdC5QcmludGxuKCJ0ZXJtaW5hdGUgZ29yb3V0aW5lIikKCX0oKQoJZm10LlByaW50bG4oInN1bSIsIGNvbWJpbmVyKGl0ZXJhdG9yKSkKCXRpbWUuU2xlZXAodGltZS5TZWNvbmQpCn0K