Направление канала в 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
}
Скажите, соберется ли такая функция.
Скажите, зачем передают в функцию канал только на прием, если внутри нужно лишь читать.