The philosophy for sharing data with Go is Don't communicate by sharing memory; instead, share memory by communicating. Channels are the language construct that support this approach – they allow the sharing of data by communicating between goroutines correctly, rather than sharing common data. This is the main way that Go avoids race conditions (that is, one thread writing data while others read the same data). Channels are used for all sorts of patterns in Go – they can communicate the result of a goroutine (or pass data between routines), provide updates when data changes, or even signal that processes should finish.
Channels, just like all variables and constants in Go, require a type. The type of a channel determines the data ...