Ответ
Главные проблемы при конкурентной записи в WebSocket:
-
Гонка данных - несколько горутин могут одновременно пытаться записать в соединение, что приводит к повреждению сообщений. WebSocket соединение не потокобезопасно.
-
Блокировка - долгая запись одной горутиной может заблокировать другие.
-
Паника - попытка записи в закрытое соединение вызовет панику.
Решение - использовать мьютексы или каналы для синхронизации:
type SafeConn struct {
conn net.Conn
mu sync.Mutex
}
func (sc *SafeConn) Write(data []byte) error {
sc.mu.Lock()
defer sc.mu.Unlock()
_, err := sc.conn.Write(data)
return err
}
Или канал-диспетчер:
func writer(conn net.Conn, ch chan []byte) {
for msg := range ch {
conn.Write(msg)
}
}