Go's concurrency primitives make it easy to construct streaming data pipelines that make efficient use of I/O and multiple CPUs. This article presents examples of such pipelines, highlights subtleties that arise when operations fail, and introduces techniques for dealing with failures cleanly. There's no formal definition of a pipeline in Go; it's just one of many kinds of concurrent programs. Inf