Ваш for
l oop запускает 3 процедуры, которые вызывают функцию add
.
Кроме того, main
сам работает в отдельной "главной" программе.
Поскольку подпрограммы выполняются одновременно, порядок их выполнения обычно непредсказуем и зависит от времени, загруженности вашей машины и т. Д. c. Результаты могут отличаться между пробегами и между машинами. Вставка time.Sleep
вызовов в разных местах может помочь визуализировать это. Например, вставка time.Sleep
за 100 мс до «оператора блокировки» показывает, что все add
запускаются программы.
Как правило, вы можете увидеть, что один запуск add
запускает, добавляет его фрагмент к sum
и записывает sum
в dataChannel
. Поскольку main
запускает несколько подпрограмм и сразу читает из канала, это чтение получает sum
, записанное add
, и затем программа существует - потому что по умолчанию main не будет ждать завершения всех подпрограмм до конца sh.
Более того, поскольку канал dataChannel
небуферизован и main
читает только одно значение, другие процедуры add
будут блокировать канал на неопределенный срок во время записи.
Я рекомендую просмотреть некоторые вводные ресурсы для процедур и каналов. Они строят концепции из простых принципов. Несколько хороших ссылок для вас: