This refers to Go channels, which are used to communicate between goroutines.
Traditional languages use threads for concurrency, and have no concept analogous to channels. So if two threads need to share information, there's usually no choice but for both of them update some shared piece of memory, whether that's a global variable, database record, etc. But this can lead to race conditions, where one thread updates that shared memory while a different thread is actively working with it, leading to errors and bugs. You can mitigate the problem by having the threads signal that they're updating the value, using mutexes and the like, but that's 1. a pain to code and 2. cuts into the speed benefits of multithreading.
Channels are specifically designed for communication between goroutines. You can be certain that only one goroutine is writing a value, and only one goroutine is reading a particular value. Go offers both buffered and unbuffered channels. An unbuffered channel automatically synchronizes goroutines: a goroutine that writes to a channel will block until another goroutine reads from it, and vice-versa.
This all probably sounds confusing to those who haven't done concurrent programming before. So here's the TLDR: Go makes concurrent programming easier and less error-prone than other languages.