Pythons-Yield-With-Go
Created:A blog post to describe 3 ways (or 2 alternative ways) to emulate python’s yield in go.
Yield is used to write iterators in python (and other languages. c# added yield in version 2, more than a decade ago). A loop calls a function that calls yield to return the next item in the sequence.
- using channels.
- using callback function with a closure / same as a continuation or call/cc?
- using an iterator object to store state
Eric S. Raymond wrote an evaluation of go from his porting of the code of a project from python which mentions porting python’s iterators.
How does ESR’s method compare is under 2. I think. Todo: link to ESRs info.
Ewen Cheslack-Postava’s discussion on iterator patterns
Here’s the results of running ryszard’s iterator benchmark on my machine, using go 1.13.6
golang-iterators-benchmark-master>go test -bench .
goos: windows
goarch: amd64
pkg: ryszard-iter/golang-iterators-benchmark-master
BenchmarkIntsCallbackIterator-8 462 2508035 ns/op
BenchmarkDataCallbackIterator-8 372 2975549 ns/op
BenchmarkIntsChannelIterator-8 4 298740575 ns/op
BenchmarkDataChannelIterator-8 4 300250475 ns/op
BenchmarkIntsBufferedChannelIterator-8 9 111217711 ns/op
BenchmarkDataBufferedChannelIterator-8 10 114300030 ns/op
BenchmarkIntsClosureIterator-8 418 2812871 ns/op
BenchmarkDataClosureIterator-8 397 3011335 ns/op
BenchmarkIntStatefulIterator-8 655 1794547 ns/op
BenchmarkDataStatefulIterator-8 615 1936387 ns/op
BenchmarkIntStatefulIteratorInterface-8 267 4393849 ns/op
BenchmarkDataStatefulIteratorInterface-8 267 4415787 ns/op
PASS
ok golang-iterators-benchmark-master 22.480s