Отправка и прием по каналу в Go
Канал без буфера работает как рукопожатие: отправка не заканчивается, пока другая ветка не выполнит прием, и наоборот. Так значение переходит напрямую от отправителя к получателю.
Создают связь для целых чисел, запускают
получателя, затем в main кладут
число и ждут, пока вторая ветка его
заберет:
package main
import "fmt"
func recv(ch chan int) {
v := <-ch
fmt.Println(v)
}
func main() {
ch := make(chan int)
go recv(ch)
ch <- 42
}
На экране 42. Строка с отправкой
в main ждала, пока recv
не дошла до приема.
Прием можно записать с двумя результатами, если позже понадобится отличать обычное значение от конца потока; пока достаточно одной переменной:
package main
import "fmt"
func main() {
ch := make(chan int)
go func() {
ch <- 7
}()
fmt.Println(<-ch)
}
Дана функция:
func take(ch chan int) {
fmt.Println(<-ch)
}
В main создайте канал целых,
запустите take отдельной веткой,
отправьте 100 и дождитесь печати.
Дан следующий код:
ch := make(chan int)
ch <- 1
fmt.Println(<-ch)
Скажите, почему программа здесь не дойдет до печати.
Скажите, чем канал без буфера отличается от обычной переменной, которую две горутины меняют без синхронизации.