Вам не нужно это в Go, так как в Go это будет анти-паттерном.
Вместо этого в Go у вас есть управление дескрипторами "pollable" - такими как сокеты - тесно интегрированными со средой выполнения и планировщиком работы с программой.
Это позволяет вам писать обычный последовательный код, который будет внутренне обрабатываться через зависящий от платформы интерфейс «с событиями» (такой как epoll
в Linux, kqueue
в FreeBSD и IOCP в Windows).
Как только программа пытается выполнить какой-либо ввод-вывод для сокета, а сокет не готов, процедура приостанавливается до тех пор, пока эти данные не будут готовы, после чего они будут возобновлены прямо в том месте, где они были приостановлены.
Следовательно, в Go вы просто создаете отдельную программу, которая обслуживает каждый запрос, который должен быть выполнен или обслуживается одновременно с другими, и пишете простой последовательный код для его обработки.
Для обратного хода начните здесь и здесь .
Учебники, объясняющие, как работает планировщик Go,
например, это
и это .