Попытка написать «умный» код всегда оборачивается проблемами, когда другим разработчикам приходится его поддерживать (где «другие» включают вас самих через четыре недели).
Точечный импорт позволяет импортировать пакет и использовать его экспортируемые идентификаторы без префикса имени пакета.
Например, если вы импортируете
fmt
через .
, вы можете вызвать Println()
и другие функции без префикса fmt.
.Почему это антипаттерн?
Экспортируемые идентификаторы из этого пакета выглядят так, как будто они определены в текущем пакете. Это плохо по двум причинам:
1. Это запутывает, когда ищешь определение идентификатора в текущем пакете.
2. Некоторые пакеты имеют заменители, которые экспортируют те же идентификаторы. Если эти пакеты импортируются через точечный импорт, можно подумать, что идентификаторы принадлежат оригинальному пакету, хотя на самом деле они принадлежат заменителю.
Если метод обновляет свой ресивер и ничего не может пойти не так при этом обновлении, метод не должен ничего возвращать. Несколько таких методов можно вызывать один за другим (пример #2).
Для объединения методов в цепочку нужно, чтобы каждый метод возвращал свой ресивер. Тогда мы можем вызывать второй метод, как в 3-м примере.
Ура, мы сэкономили одну строку!
Почему это антипаттерн
Три причины:
1. Мы ничего не приобрели. Цепочки методов не дают нам ничего, чего у нас уже нет.
2. Методы в цепочке не могут возвращать ошибки. Если есть ошибки, нужно вернуться к обычному паттерну. Теперь у вас в коде два разных стиля: цепочки и обычный.
3. Код на Go предпочитает, чтобы чтение кода фокусировалось на левой стороне. Это означает короткие строки и мало уровней вложенности (в идеале только один). Цепочки методов могут легко пересекать весь экран и даже вызвать разрыв строки, что делает код трудночитаемым и некрасивым.
👇 Продолжение 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤5🤔2🔥1
В 4-м примере
main
вызывает mysteriousDefer()
как отложенную функцию, поэтому все, что напечатает mysteriousDefer()
, должно быть напечатано после того, как main
выполнит свои выводы.Однако если вы запустите этот код, вы получите следующий вывод:
f runs
main runs
func returned by f runs
Почему это антипаттерн
Этот «хитрый трюк» позволяет объединить инициализацию и очистку в одной функции.
Вы заметили двойные скобки в вызове
defer
?
defer mysteriousDefer()()
Обычно вы бы вызвали отложенную функцию так:
defer mysteriousDefer()
Вторые скобки вызывают
mysteriousDefer()
перед тем, как она будет оценена директивой defer
. Затем mysteriousDefer()
печатает свое сообщение и возвращает другую функцию, которая является фактической функцией, отложенной defer
.Этот запутанный набор трудно понять, а двойная пара скобок легко может быть пропущена при беглом ревью кода.
Что плохого в написании функции инициализации и функции очистки отдельно?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤3
🧬 Мысли об использовании Go для биоинформатики
Биоинформатик и инженер по обработке данных размышляет об использовании различных языков для научной работы, уделяя особое внимание Go и Rust, Python, Crystal, Julia и Zig.
У Go много плюсов, но, по его мнению, он не прорвался в биоинформатику в крупных масштабах, хотя за пределами этой области у него был феноменальный рост?
Любопытно, что автор оценивает количество строк для работы с файлами и вообще сложность этой операции с точки зрения среднестатистического программиста. На основании этого делает выводы, сравнивая с языком D и его четырьмя строками.
💬 Как вам такой подход?
Биоинформатик и инженер по обработке данных размышляет об использовании различных языков для научной работы, уделяя особое внимание Go и Rust, Python, Crystal, Julia и Zig.
У Go много плюсов, но, по его мнению, он не прорвался в биоинформатику в крупных масштабах, хотя за пределами этой области у него был феноменальный рост?
Любопытно, что автор оценивает количество строк для работы с файлами и вообще сложность этой операции с точки зрения среднестатистического программиста. На основании этого делает выводы, сравнивая с языком D и его четырьмя строками.
💬 Как вам такой подход?
😁21👍5🥱1🌚1👾1
Forwarded from Библиотека программиста | программирование, кодинг, разработка
This media is not supported in your browser
VIEW IN TELEGRAM
🕹️🔥 Интерактивное исследование распространенных стратегий организации очередей
Перед вами мини-исследование, в котором изучается организация очередей в контексте HTTP-запросов. Автор начинает с простых концепций и постепенно разбирается с более сложными очередями.
📌 Под катом:
☑️ Чем полезны очереди
☑️ 3 разных типа очереди
☑️ Как эти 3 очереди сравниваются друг с другом
☑️ 1 дополнительная стратегия организации очередей, которую вы можете применить к очередям любого типа, чтобы не отбрасывать приоритетные запросы
Перед вами мини-исследование, в котором изучается организация очередей в контексте HTTP-запросов. Автор начинает с простых концепций и постепенно разбирается с более сложными очередями.
📌 Под катом:
☑️ Чем полезны очереди
☑️ 3 разных типа очереди
☑️ Как эти 3 очереди сравниваются друг с другом
☑️ 1 дополнительная стратегия организации очередей, которую вы можете применить к очередям любого типа, чтобы не отбрасывать приоритетные запросы
🥰11👍5⚡1
Go известен своей лаконичностью и простотой синтаксиса, но даже в нём есть множество подводных камней, с которыми можно столкнуться в работе. Дмитрий Королёв, бэкенд-разработчик в Авито, разбирает распространённые ошибки с примерами и рассказывает, как их можно избежать.
👉 Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🤔5❤2
Доклады были опубликованы уже месяц назад, но лучше поздно, чем никогда 👇
🌐 Как стать сеньором / Василий Романов (VK, Облако Mail ru)
🌐 Domain Driven Design в Go — это не больно (почти) / Илья Сергунин (Авито)
🌐 Go в Domain Driven Design / Дмитрий Анисов (GS Labs)
🌐 Как научить сервис сообщать об ошибке, чтобы это было понятно пользователям, машинам / Александр Лырчиков (YADRO)
🌐 Работа с аренами — почти избавляемся от GC / Максим Горозий (Тинькофф)
🌐 Собеседования на senior-разработчика: проверяем soft skills вопросами на hard skills / Иван Матвеев
🌐 Потоки данных, графы, стейт-машина — строим бизнес-логику в Go-микросервисах / Апрес Антонян
🌐 Выжимаем из Go максимум производительности / Никита Галушко (VK, ВКонтакте)
👉 Весь плейлист
#чтопроисходит
👉 Весь плейлист
#чтопроисходит
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
🖼 Визуализация покрытия кода Go в виде древовидной карты
Интересный способ визуализировать большие проекты с помощью результатов
👩💻 GitHub
Интересный способ визуализировать большие проекты с помощью результатов
go test -coverprofile
.$ go install github.com/nikolaydubina/go-cover-treemap@latest
$ go test -coverprofile cover.out ./...
$ go-cover-treemap -coverprofile cover.out > out.svg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥40👍6
Forwarded from Библиотека дата-сайентиста | Data Science, Machine learning, анализ данных, машинное обучение
💻🚀🏰 Как мы создали ИИ-стартап на хакатоне выходного дня в Германии
Инженер ПО рассказал нам о своих выходных на хакатоне в Кельне, где с командой пытался создать AI-стартап всего за два дня. Участники прошли путь от подачи идей в пятницу вечером до демонстрации работающего приложения к воскресенью.
В качестве бонуса автор привёл список основных пунктов, которые необходимо выполнить для создания стартапа.
🔗 Читать статью
🔗 Зеркало
Инженер ПО рассказал нам о своих выходных на хакатоне в Кельне, где с командой пытался создать AI-стартап всего за два дня. Участники прошли путь от подачи идей в пятницу вечером до демонстрации работающего приложения к воскресенью.
В качестве бонуса автор привёл список основных пунктов, которые необходимо выполнить для создания стартапа.
🔗 Читать статью
🔗 Зеркало
Не возвращайте err в Go. Вместо этого добавьте недостающие сведения, необходимые для отладки.
Некоторые разрабы любят жаловаться, что в Go приходится писать множество блоков
if err != nil { return err }
. Они не понимают, как работают ошибки в Go. Дело в том, что на самом деле то, на что они жалуются, является совершенно неправильным способом обработки ошибок в Go: возврат
err
напрямую — это антипаттерн.В статье автор показывает, что он имеет в виду, на примере кода: библиотеки для настройки mTLS-соединения.
👉 Читать
👍32💯7🤔4❤2🥱2
Профилируя Go-приложения во время выполнения, Go-компилятор может принимать более эффективные решения по оптимизации в последующих сборках, что приводит к существенному повышению производительности процессора.
Узнайте подробнее из доклада Cameron Balahan, Michael Pratt и James Ma на Google I/O 2024, как работает PGO и как вы можете использовать ее для улучшения (и измерения) производительности своих приложений в Google Cloud и за его пределами.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍2
Forwarded from Библиотека дата-сайентиста | Data Science, Machine learning, анализ данных, машинное обучение
👨🎓️ 33 лучших вуза России для будущих программистов 2024-2025
Составили список из 33-х вузов, где вы научитесь думать как программист и получите фундаментальные знания в области математики, информатики, компьютерных наук и так далее. Для удобства вузы отсортированы по среднему проходному баллу ЕГЭ: от наибольшего к наименьшему.
🔗 Читать статью
🔗 Зеркало
Составили список из 33-х вузов, где вы научитесь думать как программист и получите фундаментальные знания в области математики, информатики, компьютерных наук и так далее. Для удобства вузы отсортированы по среднему проходному баллу ЕГЭ: от наибольшего к наименьшему.
🔗 Читать статью
🔗 Зеркало
🥱14😁6👍5