The previous chapter introduced goroutines, which are the most important feature of Go, channels, and pipelines. This chapter will continue from the point where the previous one left off in order to help you to learn more about goroutines, channels, and the select keyword, before discussing shared variables, as well as the sync.Mutex and sync.RWMutex types.
This chapter also includes code examples that demonstrate the use of signal channels, buffered channels, nil channels, and channels of channels. Additionally, early on in this chapter, you will learn two techniques for timing out a goroutine after a given amount of time, because nobody can guarantee that all goroutines will finish before a desired time.
The chapter will end by examining the atomic package, race conditions, the context standard Go package, and worker pools.
In this...