Только для отправки: chan<- T. Только для приёма: <-chan T. Двунаправленный: chan T. Направленные типы задают контракт и не позволяют случайно закрыть или писать в канал только для чтения.
func producer(ch chan<- int)
func consumer(ch <-chan int)