• A somewhat click-baity title, but definitely worth a read. It does make a good point that though channels are the thing everyone has heard of Go using, the simpler mutex can be very useful. The docs for the sync package don't make it sound very friendly, but it is actually easier to understand for many simple use cases of just protecting access to a struct or map across goroutines. They make it sound in the go docs like you should never be using a mutex:

    Package sync provides basic synchronization primitives such as mutual exclusion locks. Other than the Once and WaitGroup types, most are intended for use by low-level library routines. Higher-level synchronization is better done via channels and communication.