Я пытаюсь понять каналы в Go. Я прочитал, что по умолчанию отправляет и получает блок, пока отправитель и получатель не будут готовы. Но как нам выяснить готовность отправителя и получателя.
Например, в следующем коде
package main
import "fmt"
func main() {
ch := make(chan int)
ch <- 1
fmt.Println(<-ch)
}
Программа застрянет на операции отправки канала, ожидая, что кто-то прочтет значение. Несмотря на то, что у нас есть операция приема в выражении println, она заходит в тупик.
Но для следующей программы
package main
import "fmt"
func main() {
ch := make(chan int)
go func () {
ch <- 1
}()
fmt.Println(<-ch)
}
Целочисленное значение успешно передается из подпрограммы go в основную программу. Что заставило эту программу работать? Почему второй работает, а первый нет? Вызывает ли рутина какую-то разницу?