Найти тему
🚀 Golang meetup - online Программа митапа: ✔️ Использование ресурсов Kubernetes Go-приложениями — Антон Жуков СберМаркет Разберем основы многопоточных приложений. Как kubernetes работает с ресурсами: CPU, RAM. И как правильно настраивать ваши Go приложения для производительной работы в kubernetes ✔️ Не делай этого в golang — Олег Козырев, Авито Доклад о типичных ошибках при разработке на golang. Знание некоторых нюансов языка, помогут не напороться на "грабли", любезно оставленные создателями. В докладе будет рассказаны некоторые хорошие практики, которые уберегут от этих "граблей". Это поможет экономить время на разработку, не тратя его на разбор странных багов. ✔️ Contextual Talk (Разбираемся в устройстве пакета context) — Олег Сидоренков, OzonTech Погрузимся во внутреннее устройство пакета context, вспомним историю его появления и предоставляемый функционал. Разберём подходы и нюансы реализации, заложенные разработчиками при создании библиотеки. Обсудим кейсы использования каждого из вида контекстов. На основе полученных знаний сформируем набор лучших практик. ✔️ Распределенные транзакции: выбор реализации — Попов Виталий, InDrive Рассмотрим выбор стратегии реализации процесса, представляющего собой распределенную транзакцию, на примере проведения платежа. Сравним реализации и выбор инфраструктурных компонентов доступных в экосистеме golang: хореграфия с использованием kafka или nats, fsm, собственный движок оркестрации, temporal. Модератор Григорий Петров, Devrel Evrone Эксперт Артём Кулешов, СберМаркет ➖➖➖ 🗓 26 июня, начало в 19:00 мск, Среда 🌐 ОНЛАЙН ✅ Ссылка на регистрацию erid: 2VtzqvTVp9d Реклама: ООО «ЭВРОНЕ.ру» ИНН: 3663057399
10 месяцев назад
👣 Как загрузить пакет из приватного репозитория? ⏩Итак, ситуация. Есть приватный репозиторий. Можно склонировать себе данный репозититорий по 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, можно использовать такой вариант: git config --global url."git@private.gitlab.ru".insteadOf "https://private.gitlab.ru" 🟡Или используя access-токен git config --global url."https://${user}:${personal_access_token}@private.gitlab.ru".insteadOf"https://private.gitlab.ru" После этого go get / go install будут работать с приватными репозиториями. @golang
11 месяцев назад
👣 Go: распространенные антипаттерны Самый простой способ писать хороший код заключается в том, чтобы не употреблять в своих программах «антипаттерны». Собственно, об этом и идёт речь в этой полезной статье А вот некоторые из обсуждаемых антипаттернов: 🟡Возврат значения неэкспортируемого типа из экспортируемой функции // Не рекомендовано 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") } 📎 Статья @golang
11 месяцев назад
👣 Получение параметров при использовании ssl ▶️Итак, реальный кейс, связанный с использованием ssl/tls сертификатов. В коде есть фрагменты передачи данных из форм такого типа http://localhost:8080/?param1=value Сейчас, без использования шифрования транспорта, можно получить значение param1 так r.FormValue("param1") Вопрос: если начать шифровать транспорт, сами данные останутся незашифрованны ведь? Или придётся изменить способ получения параметров из запроса и сперва эти параметры расшифровать? ▶️Вообще, здесь не важно, происходит шифрование транспорта или нет, в хендлер придут данные в расшифровоном виде. Вот простой пример: package main import ( "fmt" "log" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Header().Set("Content-Type", "text/plain") w.Write([]byte(fmt.Sprintf("param1=%s", r.FormValue("param1")))) } func main() { http.HandleFunc("/", handler) http.NewServeMux() err := http.ListenAndServeTLS(":8080", "server.crt", "server.key", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } } А вот команда генерации сертификатов: openssl req -x509 -nodes -newkey rsa:2048 -keyout server.key -out server.crt -days 3650 Такие дела @golang
1 год назад
Исследуешь айтишную тему, но пока нет большого опыта? Залетай до 20 апреля на «Цифровой марафон» Сбера и «Школы 21» и соревнуйся с равными! Три счастливчика отправятся отдыхать на премиум-курорты и прокачивать знания в СберУниверситете. Конкурс проводят по всей России, а минимальный возраст для участия — от 18 лет. Отличная возможность оценить свои навыки и получить советы для дальнейшего развития. А главное — лучшие в своих категориях отправятся на очный финал в Москву с церемонией награждения. Для успеха нужно пройти онлайн-игру на проверку логики и памяти, тестирование в соответствии с твоим уровнем подготовки и цифровой диктант. Здесь ты выбираешь язык, на котором будешь писать код. Заработай как можно больше очков, чтобы попасть в суперфинал, расправиться с более сложными задачами и выиграть главные призы! Дедлайн подачи заявок на участие уже не за горами, скорее переходи на сайт и регистрируйся!
1 год назад
Исследуешь айтишную тему, но пока нет большого опыта? Залетай до 20 апреля на «Цифровой марафон» Сбера и «Школы 21» и соревнуйся с равными! Три счастливчика отправятся отдыхать на премиум-курорты и прокачивать знания в СберУниверситете. Конкурс проводят по всей России, а минимальный возраст для участия — от 18 лет. Отличная возможность оценить свои навыки и получить советы для дальнейшего развития. А главное — лучшие в своих категориях отправятся на очный финал в Москву с церемонией награждения. Для успеха нужно пройти онлайн-игру на проверку логики и памяти, тестирование в соответствии с твоим уровнем подготовки и цифровой диктант. Здесь ты выбираешь язык, на котором будешь писать код. Заработай как можно больше очков, чтобы попасть в суперфинал, расправиться с более сложными задачами и выиграть главные призы! Дедлайн подачи заявок на участие уже не за горами, скорее переходи на сайт и регистрируйся!
1 год назад
👣 Аутентификация и OAuth с помощью Go Держите полезные библиотеки для реализации схем аутентификации. Вы готовы? Их немало) 🟡 authboss — Модульная система аутентификации для Интернета. Он пытается удалить как можно больше шаблонов и «сложных вещей», чтобы каждый раз, когда вы запускаете новый веб-проект в Go, вы могли подключить его, настроить и начать создавать свое приложение без необходимости каждый раз создавать систему аутентификации. 🟡 branca — реализация спецификации токена branca для Golang 1.15+. 🟡 casbin — библиотека авторизации, поддерживающая такие модели управления доступом, как ACL, RBAC и ABAC. 🟡 cookietxt — предоставляет анализатор файлов формата cookie.txt. 🟡 go-guardian — Go-Guardian — это библиотека golang, которая предоставляет простой, понятный и идиоматический способ создания мощного современного API и веб-аутентификации, поддерживающей LDAP, базовую аутентификацию, аутентификацию на основе токена и сертификата. 🟡 go-jose — довольно полная реализация спецификаций JSON Web Token, JSON Web Signatures и JSON Web Encryption рабочей группы JOSE. 🟡 gologin — цепочки обработчиков для входа в систему с помощью поставщиков аутентификации OAuth1 и OAuth2. 🟡 gorbac — предоставляет облегченную реализацию управления доступом на основе ролей (RBAC) в Golang. 🟡 gosession — это быстрый сеанс для net/http в GoLang. Этот пакет, возможно, является лучшей реализацией механизма сеансов или, по крайней мере, пытается им стать. 🟡 goth — предоставляет простой, понятный и идиоматический способ использования OAuth и OAuth2. Обрабатывает несколько провайдеров «из коробки». 🟡 jeff — Простое, гибкое, безопасное и идиоматичное управление веб-сессиями с помощью подключаемых серверных частей. 🟡 jwt — безопасные, простые и быстрые веб-токены JSON для Go. 🟡 jwt-auth — промежуточное программное обеспечение JWT для http-серверов Golang со множеством параметров конфигурации. 🟡 jwt-go — полнофункциональная реализация веб-токенов JSON (JWT). Эта библиотека поддерживает синтаксический анализ и проверку, а также генерацию и подписание JWT. @golang
1 год назад
👣 Как написать и запустить миграцию базы данных в Golang При работе с базой данных миграция схемы является одной из важных задач, которую нам часто приходится выполнять на протяжении всего жизненного цикла приложения, чтобы адаптироваться к новым бизнес-требованиям. И в этой статье речь пойдёт о том, как написать и запустить миграцию схемы базы данных в Golang, используя библиотеку golang-migrate, уверен, будет полезно 📎 Туториал 📎 YouTube @golang
1 год назад
👣 Шпаргалка по Go Мощная шпаргалка по Go, которая покрывает практически все темы Если пролистать хотя бы по диагонали, есть отличный от нуля шанс пройти собеседование и получить оффер) Что внутри? ├╼ Компилятор ├╼ Пакеты ├╼ Функции ├╼ Управление памятью ├╼ Операторы ├╼ Управляющие структуры ├╼ Объектноориентированность ├╼ Интерфейсы ├╼ Обработка ошибок ├╼ Горутины (Goroutine) ├╼ Проверка управления памятью ├╼ Reflect ├╼ Добавление кода C ├╼ GUI ╰╼ Распределенные системы 📎 Cheatsheet @golang
1 год назад
👣 Mongo-driver Golang - реконнект к серверу Mongo ▶️Вопрос: как реализовано переподключение приложения на Golang к MongoDB в случае потери соединения в библиотеке go.mongodb.org/mongo-driver/mongo? На локальном компьютере при отключении Mongo приложение в течение 30 секунд висит (видимо пытается подключиться). Это время — оно задается в настройках клиента библиотеки или в самой Mongo или от чего еще зависит? Mongo поднята в контейнере, код подключения такой: ctx, _ := context.WithTimeout(context.Background(), timeoutSecond*time.Second) client, err := mongo.Connect(ctx, options.Client().ApplyURI(connString)) Сам запрос вот: err := mr.client.Database(mr.dbName).Collection(mr.collName).FindOne(ctx, filter).Decode(&p) ▶️Ответ: можно контролировать работу этого приложения с помощью context.WithTimeout или context.WithCancel(ctx). Помимо этого, у вас имеется возможность настроить клиент к базе. У клиента есть ряд параметров с таймаутами, одни для выполнения одной операции, другие отвечают за время подключения к серверу (можно сказать время отклика сервера). ⏩Когда мы кладём БД и исполняем запрос, то висит канал (go channel), который ожидает выполнения функции, либо завершения контекста, истечения timeout этого запроса. select { case <-ctx.Done(): return nil, ctx.Err() case <-selectionState.timeoutChan: return nil, wrapServerSelectionError(ErrServerSelectionTimeout, t) case current = <-subscriptionCh: } срабатывает <-selectionState.timeoutChan, по умолчанию его значение 30 секунд ⏩Документация говорит, что клиент нужно настроить следующим образом, чтобы продлить время ожидания отклика: client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017"), options.Client().SetConnectTimeout(time.Second * myTimeout), options.Client().SetServerSelectionTimeout(time.Second * myServerTimeout)) @golang
1 год назад
👣 Прервать функцию с горутинами, если выполняется слишком долго ▶️Задача: в функции нужно запустить несколько горутин с вычислениями и дождаться их окончания. При этом, если функция будет работать больше указанного количества секунд, нужно прервать ее выполнение. Таким образом нужно прервать выполнение этой функции fun() ниже, что можно сделать? package main import ( "fmt" "sync" ) func FibonacciRecursion(n int) int { if n <= 1 { return n } return FibonacciRecursion(n-1) + FibonacciRecursion(n-2) } func f(i int, wg *sync.WaitGroup) { defer wg.Done() fmt.Println(FibonacciRecursion(45 + i)) } func fun() { var wg sync.WaitGroup for i := 0; i < 3; i++ { go f(i, &wg) wg.Add(1) } wg.Wait() println("Function ended") } func main() { fun() } ▶️Что ж, для этих целей как раз и используется пакет context. С помощью context код выше можно переписать так: package main import ( "context" "fmt" "sync" "time" ) func main() { timeLimit := time.Second * 10 ctx, cancel := context.WithTimeout(context.Background(), timeLimit) defer cancel() fun(ctx) } func isDone(ctx context.Context) bool { select { case <-ctx.Done(): return true default: return false } } func FibonacciRecursion(ctx context.Context, n int) int { if n <= 1 || isDone(ctx) { return n } return FibonacciRecursion(ctx, n-1) + FibonacciRecursion(ctx, n-2) } func f(ctx context.Context, i int, wg *sync.WaitGroup) { defer wg.Done() fmt.Println(FibonacciRecursion(ctx, 45+i)) } func fun(ctx context.Context) { var wg sync.WaitGroup for i := 0; i < 3; i++ { wg.Add(1) go f(ctx, i, &wg) } wg.Wait() println("Function ended") } Такие вот дела @golang
1 год назад
Открытое собеседование на Gо-разработчика 18 апреля в 19:00 по мск приходи онлайн на Открытое собеседование от Эйч Навыков. Как это будет: 1. Сергей Парамошкин, Deputy CTO в Yandex Cloud и ментор Эйч Навыков, позадает реальные вопросы и задачи разработчику-добровольцу 2. Потом Сережа даст подробную обратную связь — объяснит, зачем задавал тот или иной вопрос, как лучше на него ответить или решить задачу 3. В конце можно будет задать любой вопрос Сереже Что узнаешь на Открытом собеседовании: - Чего ждут от кандидатов на мидл-позиции в Gо-разработке - Какие вопросы задают на интервью и зачем - Как подготовиться к собесу, чтобы получить заветный оффер Это бесплатно? Бесплатно Просто зарегистрируйся на открытое собеседование в нашем боте @skills_mentee_bot Реклама: ООО “Эйч Карьера” erid: LjN8KUVBM
1 год назад