Здесь, на игровой площадке Go , находится ваш оригинальный код с небольшими изменениями:
- задержки уменьшены, за исключением
time.Sleep(5)
, который становится time.Sleep(time.Second)
; - a
return
удалено, поскольку оно становится ненужным; - a
fmt.Println
закомментировано, поскольку как return
, так и незакомментированное fmt.Println
, go vet
жалуетсяо недоступном fmt.Println
; - канал, сохраненный в
errChang
, изменяется на небуферизованный.
При запуске его вывод:
1
hola
2
(с небольшой задержкой перед 2
), показывая, что действительно анонимная программа, которую вы запустили в функции leaking
, все еще работает.
Если мы раскомментируем закомментированный fmt.Println
, вывод:
1
hola
6
1
(с такой же небольшой задержкой перед окончательным 1
), потому что теперь мы ждем (а затем печатаем) значение, вычисленное в return666
и отправленное по каналуerrChang
.
Если мы оставим закомментированный fmt.Println
закомментированным и сделаем канал buf* * * * * * , вывод будет:
1
hola
1
, так как анонимная программа теперь может выдвинуть свое значение (6) в канал.
Сам канал будет собирать мусор,вместе с единственным значением, хранящимся внутри него, так как на данный момент нет никаких ссылок на канал. Однако обратите внимание, что простого создания буферизованного канала не всегда достаточно. Если мы отправим два значения по каналу , программа вернется к печати:
1
hola
2
, когда анонимная программа успешно вставит 6
в канал, но затем блокирует попытку вставить 42
в том числе.