Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
clients не потокобезопасна.clients — использовать defer:connection, _ := upgrader.Upgrade(w, r, nil)
defer connection.Close()
server.clients[connection] = true // Сохраняем соединение, используя его как ключ
defer delete(server.clients, connection)
спасибо, учту. map был использован, так как суть туториала показать базовую работу с библиотекой, чуть лучше и проще чем в официальной документации, не больше. А насчет defer, это такое требование к код стайлу или все таки вкусовщина?
Просто задаваясь вопросом, как отслеживать все что происходит по окончанию функции, очевидно что посмотреть на все defer. Но как таким образом контролировать, в каком порядке производятся те или иные действия
defer срабатывают в обратном порядкеreturn где-то в середине функции или случится panic, то код в defer всё равно отработаетtry/finally — по сравнению с defer код «очистки» находится далеко от кода «создания», а также добавляется дополнительный (дополнительные) уровень вложенностиМне gobwas/ws больше понравился, хотя может я просто ещё не напоролся на подводные камни.
Простейший сервер на Gorilla WebSocket