Ни один из примеров не работает.На самом деле, ни один пример, который только посылает на канал, никогда не будет работать, в традиционном смысле «работа».
Но вот шаг за шагом, чтобы прояснить:
Первый пример
ch := make(chan int)
Это создает небуферизованный канал.Небуферизованные каналы не содержат никаких данных, они только служат каналом связи - все отправленные данные должны быть получены чем-то другим, прежде чем будет продолжено выполнение программы - по обе стороны канала.
ch <- 1
Здесь вы отправляете данные по каналу, но ничего не ожидает их получения, поэтому программа ожидает.В этом случае он ждет вечно, потому что вы никогда не создавали приемник для канала, таким образом, ваш тупик.
Второй пример
c := make(chan int)
Снова, создайте небуферизованный канал.
go sum(s[:len(s)/2], c)
Вызовите функцию sum
, которая, кстати, также будет блокироваться навсегда по причинам, описанным выше - ничего на канале не принимается, поэтому он будет ждать вечно.Тем не менее, в этом случае вы назвали это в goroutine.Программа будет выполняться в отдельном потоке выполнения, в то время как другие части программы выполняются.Хотя из-за того, что данные с канала никогда не поступают, эта программа никогда не завершится, пока не выйдет основная программа.
go sum(s[len(s)/2:], c)
Снова вы вызываете sum
, и снова в программе.Таким образом, на данный момент у вас есть три gorotuines: один работает main()
, и один каждый выполняет вызов sum()
.Последние два никогда не завершатся.
Тогда ваша программа завершится.При выходе из программы все программы (включая две, застрявшие навсегда в ожидании на вашем канале) завершаются.
Поскольку эта программа выходит немедленно, о взаимоблокировке никогда не сообщается, но она наверняка существует, как и в вашейПервый пример.