At my workplace, a lot of folks are coming to Go from Python and Kotlin. Both languages have
structured concurrency built into their async runtimes, and people are often surprised that
Go doesn’t. The go statement just launches a goroutine and walks away. There’s no scope
that waits for it, no automatic cancellation if the parent dies, no built-in way to collect
its errors.
This post looks at where the idea of structured concurrency comes from, what it looks like
in Python and Kotlin, and how you get the same behavior in Go using errgroup, WaitGroup,
and context.