аждый вызов sync.Add() увеличивает счетчик в поле state1, которое представляет собой массив с тремя элементами uint32. Обратите внимание, что действительно важно вызвать sync.Add() перед операцией go, чтобы предотвратить какие-либо состояния гонки. О них вы узнаете в разделе «Состояния гонки» данной главы. Когда горутина завершает свою работу, должна быть выполнена функция sync.Done(), уменьшающая тот же счетчик на единицу. «За кулисами» sync.Done() просто совершает вызов Add(-1). Метод Wait() ожидает, пока этот счетчик не станет равным 0, после чего возвращается. Возврат Wait() внутри функции main() означает, что main() собирается вернуться и программа завершится.