Pull to refresh

Comments 7

Навскидку пара замечаний по коду:

1. Работа с clients не потокобезопасна.
2. Закрытие соединения и удаление из clients — использовать defer:
connection, _ := upgrader.Upgrade(w, r, nil)
defer connection.Close()

server.clients[connection] = true // Сохраняем соединение, используя его как ключ
defer delete(server.clients, connection)

спасибо, учту. map был использован, так как суть туториала показать базовую работу с библиотекой, чуть лучше и проще чем в официальной документации, не больше. А насчет defer, это такое требование к код стайлу или все таки вкусовщина?

Просто задаваясь вопросом, как отслеживать все что происходит по окончанию функции, очевидно что посмотреть на все defer. Но как таким образом контролировать, в каком порядке производятся те или иные действия

  1. defer срабатывают в обратном порядке
  2. Если вы добавите return где-то в середине функции или случится panic, то код в defer всё равно отработает
  3. В другом языке можно было бы использовать try/finally — по сравнению с defer код «очистки» находится далеко от кода «создания», а также добавляется дополнительный (дополнительные) уровень вложенности

Мне gobwas/ws больше понравился, хотя может я просто ещё не напоролся на подводные камни.

Sign up to leave a comment.

Articles