Дедлок (deadlock) в Golang возникает, когда две или более горутины оказываются в состоянии ожидания друг друга, так что ни одна из них не может продолжить выполнение. Это происходит, когда группа горутин одновременно ожидают освобождения ресурсов, которые удерживаются другими горутинами из этой же группы.
Наиболее распространенные причины дедлоков в Golang связаны с использованием каналов:
Если все горутины в программе заблокированы и ожидают друг друга, среда выполнения Golang обнаружит этот дедлок и завершит программу с сообщением об ошибке.
Пример простейшего дедлока с использованием канала:
go
Пример дедлока с двумя горутинами и двумя каналами (классический "философы за столом"):
go
Обнаружение и предотвращение дедлоков требует тщательного анализа взаимодействия горутин и правильного использования примитивов синхронизации, таких как каналы и mutex'ы.