В Go можно ограничить канал только на чтение или только на запись. Это делается через типы <-chan T (только чтение) и chan<- T (только запись).
func producer(out chan<- int) {
out <- 42
close(out)
}
func consumer(in <-chan int) {
for val := range in {
fmt.Println(val)
}
}
func main() {
ch := make(chan int)
go producer(ch)
consumer(ch)
}
Смысл — в документировании намерений и защите от ошибок на этапе компиляции. Если функция принимает <-chan int, она не сможет случайно записать в канал или закрыть его. Двунаправленный chan T автоматически приводится к направленному типу, но не наоборот. Это хорошая практика — всегда указывать направление в сигнатуре функции.