Deadlock — взаимная блокировка, когда две или более горутины ждут друг друга и ни одна не может продолжить.
Классический пример: горутина A держит мьютекс 1 и ждёт мьютекс 2, горутина B держит мьютекс 2 и ждёт мьютекс 1. Go runtime умеет детектить простой deadlock — если все горутины заблокированы, программа крашится с fatal error: all goroutines are asleep - deadlock!.
Предотвращение: всегда захватывай мьютексы в одном порядке, используй select с default или таймаутами, используй context с дедлайнами.