Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Короткий пост, основной ценностью которого станут комментарии (я надеюсь).
Я перешел на Го довольно недавно. Пока отметил три проблемы:
time.Ticker
не останавливается: пропущенная строчкаdefer tick.Stop()
В комментарии к библиотечному типу сказано что он "безопасен для конкурентного использования", но не сказано как именно методы могут вызываться и из каких горутин. Умолчанием можно считать "любой метод типа можно вызывать откуда угодно в любой последовательности", но на практике для большинства thread-safe типов это не так: у них есть либо некоторый жизненный цикл (start-stop), либо семантика поддерживает только одного писателя: мутирующие методы могут вызываться только из одной горутины, либо и то, и другое.
Пункт связанный и отчасти пересекающийся с предыдущим: в структуре есть поле
sync.Mutex
, но нет комментария поясняющего что он защищает, и главное, почему (например, "доступ к этим полям должен быть защищен, потому что они пишутся из горутины такой-то и читаются из горутинnet/http
сервера"). Наиболее частая ситуация — нет вообще никаких комментариев, просто мьютекс который используется в каких-то методах, зачем, почему — добро пожаловать в игру "что девелопер хотел сказать этим кодом". Иногда (если повезет) какие-то объяснения можно найти в пулл-реквесте где был добавлен этот код.
Отмечу, что даже в исходниках golang/go, которые обычно не балуют комментариями (не считая документирующих), все мьютексы в подпакетахnet/
снабжены короткими комментариями.
Вопрос людям, которые пишут на Го подольше — какие проблемы регулярно замечаете вы, на ревью, копаясь в старом коде, или коде библиотек?
Этот пост — перевод-кросспост с поста на Реддите.