Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpChDr 163 of 280 menu
◀ ▶

Направление канала в Go

Тип канала можно сузить: стрелка слева от слова означает только прием, справа только отправку. Так функция не сможет случайно выполнить лишнюю операцию.

Отправитель принимает канал только на запись, получатель только на чтение; обычный канал из main подходит обоим:

package main import "fmt" func send(ch chan<- int) { ch <- 9 } func recv(ch <-chan int) { fmt.Println(<-ch) } func main() { ch := make(chan int) go send(ch) recv(ch) }

На экране 9. В recv нельзя написать отправку: тип параметра это запрещает на этапе сборки.

Возвращать из функции можно канал с узким типом, а вызывающий код получит только нужную сторону:

package main import "fmt" func out() <-chan int { ch := make(chan int, 1) ch <- 3 return ch } func main() { fmt.Println(<-out()) }

Даны заготовки:

func put(ch chan<- string) { ch <- "ok" } func get(ch <-chan string) { fmt.Println(<-ch) }

В main свяжите канал строк, запустите put в ветке и вызовите get в main.

Дан следующий код:

func onlyRead(ch <-chan int) { ch <- 1 }

Скажите, соберется ли такая функция.

Скажите, зачем передают в функцию канал только на прием, если внутри нужно лишь читать.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить