Если я правильно понял задачу - вам нужно корректно закрыть все соединения и завершить работу WebSocket сервера.
По сути аккуратное закрытие клиентского WebSocket соединения выглядит так:
- сервер отправляет в сокет frame с типом Close
- клиент при получении frame с типом Close формирует ответ с типом Close
- сервер ждёт ответ от клиента с типом Close (клиент подтверждает закрытие соединения)
- сервер со своей стороны закрываете сокет, клиент со своей стороны закрывает сокет
Т.е. вам просто нужно в цикле во все открытые сокеты отправить frame'ы с типом Close, дождаться ответа с типом Close, после чего закрыть сокет, или по таймауту закрыть сокет.
Для работы с websocket'ами я использовал вот этот пакет
https://pkg.go.dev/github.com/gobwas/ws
Пример отправки frame'а с типом Close
closeFrame := ws.NewCloseFrame([]byte{})
// отправляем
err := ws.WriteFrame(wsconn, closeFrame)
Пример чтения ответа от клиента
header, err := ws.ReadHeader(wsconn)
if header.OpCode == ws.OpClose {
// клиент подтвердил закрытие, соединение можно закрывать
wsconn.Close()
}