Самый простой способ писать хороший код заключается в том, чтобы не употреблять в своих программах «антипаттерны». Собственно, об этом и идёт речь в этой полезной статье
А вот некоторые из обсуждаемых антипаттернов:
🟡Возврат значения неэкспортируемого типа из экспортируемой функции
// Не рекомендовано
type unexportedType string
func ExportedFunc() unexportedType {
return unexportedType("some string")
}
// Рекомендовано
type ExportedType string
func ExportedFunc() ExportedType {
return ExportedType("some string")
}
🟡Неоправданное использование пустых идентификаторов
идентификаторов
// Не рекомендовано
for _ = range sequence
{
run()
}
x, _ := someMap[key]
_ = <-ch
// Рекомендовано
for range something
{
run()
}
x := someMap[key]
<-ch
🟡Ненужное выражение return в функциях
// Бесполезное выражение return, не рекомендовано
func alwaysPrintFoofoo() {
fmt.Println("foofoo")
return
}
// Рекомендовано
func alwaysPrintFoo() {
fmt.Println("foofoo")
}
🟡Ненужные команды break в выражениях switch
// Не рекомендовано
switch s {
case 1:
fmt.Println("case one")
break
case 2:
fmt.Println("case two")
}
// Рекомендовано
switch s {
case 1:
fmt.Println("case one")
case 2:
fmt.Println("case two")
}
Scikit-learn - это библиотека машинного обучения, построенная на NumPy и SciPy, поддерживающая алгоритмы контролируемого и неконтролируемого обучения. Golearn - это аналогичная библиотека для Go, предлагающая ряд моделей и утилит.
Pandas - это библиотека Python для подготовки высокоуровневых наборов данных для машинного обучения и тренировки моделей. Dataframe-go предоставляет аналогичную функциональность для манипулирования данными в Go.
TensorFlow библиотека с открытым исходным кодом Python используется для разработки и оценки моделей машинного обучения и глубокого обучения. Gorgonia - это аналогичная библиотека для машинного обучения на Go.
Seaborn - это библиотека Python, используемая для визуализации данных в проектах ML. Gonum/plot предоставляет аналогичные возможности визуализации данных в Go.
Go SDK Будучи скромным гофером хочу отметить, что решение тех или иных задач - требует понимание базы и идиом языка. Конечно, есть замечательная документация, есть не менее замечательный хаб, но пока самые-самые сердечки это репозитория go, где в центре внимания легендарный пакет runtime и sync. Вот несколько примеров, как описан sync.Map в коде, комментарии к которому и реализация методов отвечает на многие вопросы
//...
// Load, LoadAndDelete, LoadOrStore, Swap, CompareAndSwap, and CompareAndDelete
// are read operations; Delete, LoadAndDelete, Store, and Swap are write operations;
// LoadOrStore is a write operation when it returns loaded set to false;
// CompareAndSwap is a write operation when it returns swapped set to true;
// and CompareAndDelete is a write operation when it returns deleted set to true.
type Map struct {
//...
// Range may be O(N) with the number of elements in the map even if f returns
// false after a constant number of calls.
func (m *Map) Range(f func(key, value any) bool) {
// We need to be able to iterate over all of the keys that were already
// present at the start of the call to Range.
// If read.amended is false, then read.m satisfies that property without
// requiring us to hold m.mu for a long time.
read := m.loadReadOnly()
if read.amended {
// m.dirty contains keys not in read.m. Fortunately, Range is already O(N)
// (assuming the caller does not break out early)...
...
Всем приятного копания базы и профессионального роста.
Как загрузить пакет из приватного репозитория Golang?
⏩Итак, ситуация. Есть приватный репозиторий. Можно склонировать себе данный репозититорий по ssh, но через go get / go install происходит ошибка:
go: unrecognized import path "private.gitlab.ru/repositoryName": https fetch: Get "https://private.gitlab.ru/repositoryName?go-get=1": dial tcp 255.255.255.255:443(левый IP адрес): i/o timeout
Попытки установить хост данного репозитория себе в переменные GONOPROXY / GOPRIVATE / GONOSUMDB не помогли, ошибка остаётся той же.
⏩Возможно, у кого-то тоже была такая проблема, надеюсь, этот совет ещё кому-то пригодится. Итак, если есть доступ по SSH, можно использовать такой вариант:
В go 1.22 провели изящный рефакторинг части когда по увеличение емкости среза на x1.25 относительно порога значения емкости в 256. Не большой тест на arm M1 Pro:
const threshold = 256
//v 1.21
func BenchmarkName121(b *testing.B) {
var newcap = threshold
var newLen = 100_000_000_000
for 0 < newcap && newcap < newLen {
newcap += (newcap + 3*threshold) / 4
}
if newcap <= 0 {
newcap = newLen
}
}
//v 1.22
func BenchmarkName122(b *testing.B) {
var newcap = threshold
var newLen = 100_000_000_000
for {
newcap += (newcap + 3*threshold) >> 2
if uint(newcap) >= uint(newLen) {
break
}
}
}
Для тех, кто ещё не пробовал использовать GoLand для работы с Go — попробуйте, вам понравится)
Вот некоторые фишки:
⏩Умное автодополнение. Автодополнение в GoLand помогает писать код быстрее. Сочетание клавиш Ctrl+Shift+Space вызывает список вариантов автодополнения, наиболее подходящих для данного контекста.
⏩Инспекции и быстрые исправления. Обнаружив проблему, IDE тут же предложит ее исправить. Чтобы применить автоматическое исправление, просто нажмите Alt+Enter.
⏩Генерация кода. В некоторых случаях GoLand может cгенерировать для вас тривиальный код. Например, если вы нажмете Ctrl+O, IDE поможет вам реализовать любой интерфейс, сгенерировав его методы.
⏩Обнаружение рекурсивных вызовов. Если внутри вашей функции есть рекурсивный вызов, GoLand обнаружит его и поставит метку на поле редактора — это упростит чтение и понимание кода.
⏩Действие Type Parameter. Действие Type Parameter (Alt+) всегда под рукой, если необходимо узнать тип выражения, на котором находится курсор.
⏩Подсветка точек выхода. Каждая функция может иметь больше одного оператора return или panic. Чтобы быстро найти их все, нажмите Ctrl+Shift+F7, установив курсор на ключевом слове func, return или panic. Это поможет быстрее понять, как работает функция.
Вот такие классные возможности, так что пользуйтесь GoLand)
Несколько экземпляров приложения могут стучаться к флуд-контролю, поэтому нужно использовать какую-нибудь БД.
⏩1 идея: использовать SQL. Проблема: много возни с индексами по timestamp, т.к. обновление данных очень частое, следовательно перестройка индексов будет занимать много времени.
⏩2 идея: использовать redis + timeseries. Решил воспользоваться ввиду наличия всех нужных методов: добавление timestamp по ключу (очевидно userID), а также любого числового значения (количество запросов во время timestamp); плюс наличие агрегации, автоматического удаления старых меток и готовой concurrency - если в один timestamp появится несколько нажатий, то они складываются. Осталось лишь написать это на Go.
Есть готовый пакет для работы с redis — github.com/redis/go-redis. В переменные окружения нужно добавить следующие переменные:
FC_REDIS_HOST=localhost
FC_REDIS_PORT=6379
FC_REDIS_PASSWORD=strongpassword
FC_RETENTION=5
FC_MAXCHECKS=4
FC_RETENTION и FC_MAXCHECKS, кстати, можно прописать прямо в коде. FC_RETENTION - количество секунд, за которые можно сделать не более FC_MAXCHECKS запросов.
28 марта в 19:00 мы проведем Selectel Python Meetupдля разработчиков, техлидов и тимлидов разработки. Соберем экспертов из Selectel, Банка Точка и Yandex.Cloud. Обсудим «еще один» быстрый фреймворк, плюсы и минусы чистой архитектуры, опыт перехода с Python на Go.
Темы докладов:
«Черная овечка на фоне FastAPI»,
«Слоистая архитектура в Python-приложениях: гибкость кода vs оптимизация»,
«Перешел с Python на Go. Лучше стало?».
Регистрируйтесь на митап — будем ждать вас в онлайн-трансляции или в офисе Selectel.
kelp — официальный торговый и бот для Stellar DEX. Работает «из коробки», написан на Golang, совместим с централизованными биржами и пользовательскими торговыми стратегиями.
larry — Larry 🐦 — простой генератор твиттер‑ботов, который публикует твиты из случайных репозиториев с Github.
На GitHub под лицензией Apache License 2.0 опубликован проект под названием Nuke v1.1.0. Это реализация арены памяти для Go с бенчмарками и даже реализацией параллельной арены.
Арена памяти — это метод управления памятью, при котором сразу выделяется большой блок памяти, а его части используются для удовлетворения запросов выделения от программы. В контексте языка со сборкой мусора, такого как Go, использование арен памяти может дать несколько преимуществ:
повышение производительности: распределяя память большими блоками, арены памяти сокращают накладные расходы, связанные с частыми вызовами системного распределителя памяти;
Улучшенная локальность кэша. Арены памяти также могут улучшить локальность кэша, размещая тесно связанные объекты в одном блоке памяти;
эффективность сборки мусора. Использование арен памяти может снизить рабочую нагрузку на сборщик мусора за счёт уменьшения количества объектов, которые необходимо отслеживать и собирать, что приводит к меньшему времени паузы и более предсказуемой производительности.
Однако, хотя арены памяти предлагают эти преимущества, они не являются панацеей и имеют свои недостатки, такие как потенциальное увеличение использования памяти из-за неиспользуемого пространства внутри выделенных блоков. Необходимо тщательное рассмотрение и профилирование, чтобы определить, полезно ли использование арены памяти для конкретного приложения.
Дженерики могут показаться очень простой темой. Например, вот так в Java выглядят классные и простые методы интерфейса List:
interface List<E> extends Collection<E> {
boolean add(E e);
E set(int index, E element);
}
Но у обобщений много нюансов: вложенность, вариантность, границы и т.д. Это сильно усложняет их использование. Вот не менее классный, но совсем непростой flatMap интерфейса Stream🙈:
Также, реализация дженериков - всегда трейдоф. Мы либо получаем большой исполняемый файл, из-за того, что приходится генерировать код для разных типов. Либо получаем дополнительную нагрузку в рантайме, из-за различных проверок.
Из-за таких сложностей, в языке Go (философия которого - простота и минимализм) дженерики появились аж через 12 лет после релиза языка. А первый коммент про то что нужны дженерики появился меньше чем через 24 часа🙃
Во многих популярных языках дженерики появились не с первой версии, но рано или поздно, разработчики были вынуждены их ввести:
С 2016 года данные опросов разработчиков Go помогают нам определять ключевые модели использования, понимать проблемы разработчиков, узнавать предпочтения в отношении инструментов и отслеживать новые тенденции в сообществе. Ваши отзывы очень важны для формирования будущего Go, поэтому, пожалуйста, уделите 10–15 минут, чтобы заполнить опрос до 11 февраля 2024 года. Примите участие в опросе прямо сейчас!
Чем больше разработчиков примет участие, тем лучше мы сможем понять потребности сообщества Go. Вы можете помочь распространить информацию, поделившись этим опросом в своих социальных сетях, со своими коллегами и в любых других соответствующих сообществах.