Un canal contiene valores de un tipo dado. Los valores se pueden escribir en un canal y leer desde él, y circulan dentro del canal en orden de primero en entrar, primero en salir. Hay una distinción entre los canales almacenados en búfer, que pueden contener varios mensajes, y los canales no almacenados, que no pueden. Los canales se usan normalmente para comunicarse entre goroutines, pero también son útiles en otras circunstancias.
Un canal que contiene la estructura vacía make(chan struct{})
es un mensaje claro para el usuario de que no se transmite información a través del canal y que se utiliza exclusivamente para la sincronización.
Con respecto a los canales no almacenados, la escritura de un canal se bloqueará hasta que se produzca la lectura correspondiente de otro goroutine. Lo mismo es cierto para un bloqueo de lectura de canal mientras se espera un escritor.