Golang-разработчик.
Advanced
Онлайн-практикум от команды Fevlake*
*8 лет обслуживаем IT-инфраструктуры
Начать путь разработчика на Go
Онлайн-практикум для освоения Golang (Go)
Выполни все задания и стань разработчиком на Go в российских или международных проектах
практикуйтесь, когда вам удобно
языков программирования
Golang-разработчика
25+ рабочих задач
- Конфигурирование подключения к БД (postgres)
- Работа с БД (postgres)
- Миграции (goose)
- Работа с базой на примере использования GORM
- Работа с NoSql (Mongo)
- Поднимаем сервер, роутинг, первый handler
- Работа с параметрами
- Роутер Gorilla
- Роутер Chi
- Middleware
- Контекст запроса
- fasthttp
- WebSockets
- Продвинутая работа с модулями
- Сборка с использованием Idflags
- Сборка для разных ОС
- Пакет unsafe
- Cgo
- Заворачиваем наш сервис в образ
- Продвинутая сборку образа
- Подтягиваем конфигурации из key-value store (consul)
- Синхронное взаимодействие через REST
- gRPC взаимодействие
- Interceptors
- Асинхронное взаимодействие (kafka) и pub-sub
- Работа с GraphQL в Go
- in-memory хранение
- Redis
- Самописный LRU cache
- Формат логов и уровни логирования
- Пишем логи (Greylog)
- Сквозное логирование
- Метрики (Prometheus + Grafana)
- graceful обработка сигналов
- healthcheck
Вначале мы расскажем вам о том, для чего был создан язык Go, каковы сферы его применения, а также научимся устанавливать Go, чтобы вы смогли создать свою первую программу на новом языке. Введение и подготовка окружения
В то время, когда ООП (объектно-ориентированное программирование) как способ организации кода прочно закрепилось в практике программирования еще с конца 70-х годов прошлого века, современное программирование от этого не стало проще. Огромная скорость развития автоматизации всевозможных отраслей экономики предъявляет серьезные требования всему ИТ-сообществу. Основные вызовы, которые брошены программированию как отрасли, это:
- увеличение скорости процесса разработки прикладных решений;
- уменьшение времени вывода готовых решений в боевую среду;
- оптимизация быстродействия для работы под большими нагрузками и утилизации «железных» ресурсов.
От скорости разработки зависит то, как быстро мы сможем реализовать идею в высококонкурентной бизнес-среде. От скорости разработки, совместно со временем ввода решения в эксплуатацию, зависит то, насколько качественной будет поддержка нашего решения (исправление багов, доработка новой функциональности). От оптимизации созданного нами решения зависит то, как наш продукт будет работать в условиях высоких нагрузок и масштабирования.
Поиски решения для первых двух задач дали понять, что те огромные монолитные проекты, которые появились благодаря удобству и структуризации ООП, не могут соответствовать современным требованиям. Все потому, что каждая новая доработка или каждое исправление ошибки порождает новый каскад связанных задач. Это случается из-за того, что очень часто сроки, в которые надо было реализовать функционал, не позволяли как следует продумать решение и написать код, следуя хорошим практикам. Или перед крупным релизом пропустили на code-review задачу, где закрыли глаза на небольшое дублирование кода, а сами в своем релизном функционале не успели написать тесты. Согласитесь, что это не самые редкие случаи в жизни программиста. Таким образом, со временем может оказаться, что разросшаяся за годы функциональность превратила наш проект в огромного и неповоротливого монстра, который отнимает все больше ресурсов на поддержку.
Решением, которое стало вполне естественным и было хорошо принято сообществом, явилась декомпозиция огромной функциональности на микросервисы с четко определенной зоной ответственности.
Анализ проблемы быстродействия показал, что нет инструмента, который бы максимально эффективно использовал многопроцессорные системы, начавшие стремительно развиваться в начале XXI века.
Итогом работы над решением задач по созданию такого инструмента стал язык Go, который появился в компании Google в 2009 году.
Сферы применения языка Go обусловлены идеей его происхождения: быстрый, простой инструмент для параллельного программирования. Именно поэтому он наиболее применим при создании сетевых приложений, консольных утилит, систем мониторинга и, конечно, в web-программировании для разработки back-end. По причине того, что web-разработка находится на стыке системного, сетевого и прикладного программирования, Go здесь очень хорошо прижился.
На сегодняшний день есть примеры успешной реализации больших и сложных систем, написанных на Go:
- Kubernetes - система для развертывания, масштабирования и управления контейнерами;
- Prometheus - современная система мониторинга.
Кроме этого, являясь языком общего назначения, он становится популярной заменой языкам с динамической типизацией (например, PHP).
Все потому, что сложность систем возрастает и преимущества динамической типизации нивелируются проблемами, которые возникают в боевой среде из-за потери контроля над типами данных.
Также стоит упомянуть, что Go обладает высокой скоростью компиляции - это не только повышает эффективность работы программиста, но и сокращает время развертывания приложения при переносе в боевую среду.
Установка
Рассмотрим способы установки Go на разных системах. Далее будут приведены команды, которые необходимо выполнить в терминале ОС.
Ubuntu
Для 18.04 LTS потребуется добавить PPA репозиторий, после чего мы сможем установить Go версии 1.14. Если устанавливать из стандартного репозитория, то максимальная доступная версия будет 1.10.
sudo add-apt-repository ppa:longsleep/golang-backports sudo apt update sudo apt install golang-goДля Ubuntu 20.04 LTS версия 1.14 доступна из стандартного репозитория, поэтому можно сразу выполнить установку.
sudo apt install golang-1.14-goMac OS X
Самым удобным способом установки будет менеджер пакетов brew.
$ brew update $ brew install goWindows
Необходимо перейти по ссылке golang.org и скачать MSI-дистрибутив для установки. После этого запустить и следовать инструкциям. По умолчанию Go будет установлен в C:\Go.
Следующим шагом следует провести настройку GOPATH. GOPATH - это путь к вашему рабочему пространству, в котором будут располагаться скомпилированные бинарные файлы, исходный код проектов и вообще все, с чем вы будете работать.
echo "export GOPATH=~/go" >> ~/.profileВместо файла .profile могут быть .bash_profile, .zshrc или любой другой файл настройки терминала.
Чтобы переменная GOPATH стала доступна, нужно перечитать файл настроек терминала. Например, так:
source ~/.zshrcДалее рекомендуется создать директории рабочего пространства.
mkdir -p $GOPATH $GOPATH/src $GOPATH/pkg $GOPATH/bin
- /src - в этой директории будет находиться исходный код проектов;
- /pkg - здесь будут располагаться скомпилированные внешние зависимости;
- /bin - в этой директории будут лежать скомпилированные бинарные файлы.
Также очень полезно будет добавить $GOPATH/bin в переменную PATH, так как в процессе работы может потребоваться воспользоваться какими-то go-программами. Поэтому лучше сразу настроить среду, чтобы в процессе работы нас ничего не отвлекало. Добавим в файл настройки терминала команду и перечитаем его.
echo "export PATH=$PATH:$GOPATH/bin" >> ~/.profileСледует также упомянуть о GOROOT. GOROOT - это переменная, в которой содержится путь к директории установки Go. Эта переменная устанавливается автоматически при установке Go посредством установщика или менеджера пакетов. Однако, если вы устанавливаете Go вручную из архива или выполняете сборку из исходного кода, то эту переменную следует установить самостоятельно.
До версии Go 1.10 эта переменная требовалась при сборке. В более новых версиях необходимость в настройке этой переменной отпала, так как это значение устанавливается при установке Go. Однако знание о назначении переменной GOROOT может понадобиться при настройке IDE на работу с Go.
Далее в практикуме будет описана работа с модулями и необходимость в строгом следовании правилам работы с GOPATH станет необязательна. Но эти знания необходимы, чтобы иметь базовое понимание о работе с Go.
Проверка установки и первая программа
Теперь проверим нашу установку. Выполним в терминале команду.
go versionВ выводе команды мы должны увидеть версию Go.
go version go1.14.2 linux/amd64Для компиляции и запуска программ есть две команды:
- go run - скомпилирует программу во временном хранилище и запустит;
- go build - скомплирует бинарный файл.
Создадим файл $GOPATH/src/hello.go со следующим содержимым:
package main import "fmt" func main() { fmt.Println("Hello from Barin!") }Откроем в терминале $GOPATH/src и выполним команду:
go run hello.goПосле этого в консоли вы сможете увидеть результат работы вашей первой программы на Go.
IDE для разработки
Стоит упомянуть об инструментах для разработки на Go. На рынке программного обеспечения представлено много разных инструментов: удобных и не очень, платных и бесплатных. Но в процессе выбора инструмента следует уделить внимание тем удобствам и возможностям, которые предоставляет IDE. На сегодня большую популярность имеют два инструмента:
- Visual Studio Code — бесплатный редактор от компании Microsoft, который очень удобно и быстро расширяет свои возможности с помощью большого числа плагинов, размещенных в стандартном маркетплейсе;
- GoLand — коммерческая IDE от компании JetBrains, которая предназначена исключительно для разработки на Go и в стандартной поставке имеет все необходимые инструменты для работы.
2. Ознакомьтесь со стилем написания кода на Go (code style) и утилитой для форматирования gofmt.
3. Создайте файл main.go и напишите код, который выводит приветствие и текущие дату и время в виде строки ДД.ММ.ГГГГ ЧЧ:ММ.
- Для вывода строки нужно воспользоваться стандартным пакетом fmt.
- Для получения даты и форматирования потребуется функция из стандартного пакета time.
4. Подробно концепция пакетов и работа с ними будут рассмотрены позже. На данном этапе следует ознакомиться с функциональностью указанных пакетов.
5. Скомпилируйте ваш код и запустите полученный бинарный файл. В качестве ответа пришлите исходный код программы.
func (имя_получателя тип_получателя) имя_метода (параметры)
То есть, мы привязываем некоторое поведение к нашей структуре на этапе компиляции (в отличие от ситуации, когда внешний код инжектит функцию к соотвествующему полю структуры в рантайме, как в предыдущем задании с полем CalcDiscount).
Теперь мы можем вызывать от имени экземляра нашей структуры соотвествующий метод (ниже будет пример).
Давайте возьмем наш пример (структура Customer) и предпложим, что теперь нам нужно каким-то образом списывать сумму задолженности с баланса пользователя. Давайте сформируем требования:
- необходимо обеспечить атомарность операции, то есть, если сумма списалась с поля Debt, должна списаться и с поля Balance;
- необходимо проверить, присуствует ли на балансе сумма, необходимая для списания долга.
Оптимальным вариантом будет реализовать какую-то функцию с соответствующей логикой, но при этом эта функция - это чистой воды реализация внутренней логики структуры Customer. Добавим соответствующий метод.необходимо проверить, присутствует ли на балансе сумма, необходимая для списания долга.
internal/customer.go package internal import ( "errors" ) type Customer struct { Name string Age int balance int debt int Discount bool CalcDiscount func() (int, error) } func (c Customer) WrOffDebt() (Customer, error) { if c.debt >= c.balance { return c, errors.New("Not possible write off") } c.balance -= c.debt c.debt = 0 return c, nil } func NewCustomer(name string, age int, balance int, debt int, discount bool) Customer { return Customer{ Name: name, Age: age, balance: balance, debt: debt, Discount: discount, } } Давайте попробуем вызвать WrOffDebt: cmd/myapp/main.go package main import ( "fmt" "myapp/internal" ) func main() { cust := internal.NewCustomer("Dmitry", 23, 10000, 1000, true) cust, _ = cust.WrOffDebt() fmt.Printf("%+v\n", cust) } go run main.go Output: {Name:Dmitry Age:23 balance:9000 debt:0 Discount:true CalcDiscount:<nil>}Как мы видим, в результате выполнения метода мы получили новый объект Customer с измененным полем balance. Также вы можете заметить, что поля balance и debt у нас теперь видны только внутри пакета (напомним, что любые объекты, начинающиеся с маленькой буквы, видны только внутри пакета), тем самым мы запрещаем работать с ними напрямую извне, единственный способ повлиять на них - метод WrOffDebt.
В нашем примере мы выполняем метод, который возвращает копию нашей структуры, из-за чего нам необходимо переприсвоить возвращаемое значение. Но давайте посмотрим, как еще мы можем работать с методами, которые занимаются мутацией основного объекта. Объявим наш метод чуть-чуть по-другому: internal/customer.go
package internal import ( "errors" ) Ваш путь в программе Golang by Rebrain Name string Age int balance int debt int Discount bool CalcDiscount func() (int, error) } func (c *Customer) WrOffDebt() error { if c.debt >= c.balance { return errors.New("Not possible write off") } c.balance -= c.debt c.debt = 0 return nil } func NewCustomer(name string, age int, balance int, debt int, discount bool) *Customer { return &Customer{ Name: name, Age: age, balance: balance, debt: debt, Discount: discount, } } cmd/myapp/main.go package main import ( "fmt" "myapp/internal" ) func main() { cust := internal.NewCustomer("Dmitry", 23, 10000, 1000, true) cust.WrOffDebt() fmt.Printf("%+v\n", cust) } go run main.go Output: &{Name:Dmitry Age:23 balance:9000 debt:0 Discount:true CalcDiscount:<nil>}Как мы видим, мы присвоили метод указателю на структуру, тем самым все действия внутри метода влияют на основную структуру, что избавляет нас от лишних присваиваний.
Обратите внимание:
Для того чтобы вызвать метод, привязанный к значению, а не указателю, нам не обязательно создавать объект по значению:
package main import ( "fmt" ) type A struct {} func (a A) SeyHello() { fmt.Println("Hello, world") } func main() { instance1 := &A{} instance1.SeyHello() instance2 := A{} instance2.SeyHello() } go run main.go Output: Hello, world Hello, worldОбратное утверждение не совсем верно и будет рассмотрено в задании GO-04 03: Структуры и интерфейсы. Интерфейсы и утиная типизация
2. Предположим, что теперь нам необходимо не позволить внешнему коду предоставлять нам реализацию свойства CalcDiscount, а жестко задать реализацию в привязке к структуре Customer, для этого сделайте CalcDiscount методом, а не свойством структуры Customer:
- Логику оставить, как была в функции CalcDiscount.
- Константу DEFAULT_DISCOUNT перенести в пакет internal.
- Свойство Discount сделать нередактируемым вне пакета internal.
3. В ответе пришлите ссылку на МР ветки module04_02 с нужными правками в ветку master своего проекта.
До практикума: Digital Marketing
После практикума: Junior DevOps
До практикума я работал в сфере Digital Marketing - удаленно занимался рекламой, маркетингом. Ранее работал инженером связи, от механика и до ведущего инженера, поэтому IT мне близко, и я всегда хотел развиваться в этом направлении и вернуться в профессию. Потому заинтересовался открытым практикумом по DevOps, который предложила мне таргетная реклама. После него желание изучать DevOps усилилось - привлекли перспективы и сложная, но интересная работа. Так я решил пойти дальше на практикум. И уже в середине него устроился в аутсорсинговую компанию по администрированию инфраструктуры и дорос до Junior DevOps.
Сам практикум - бомба! Намного круче классического формата с лекциями. Когда есть лекции, ты привязан к группе, ко времени. Здесь же отстать невозможно: включайся, когда удобно, и получай на любом этапе быструю обратную связь по всем заданиям. Выходит, как формат индивидуального обучения, но только еще и с возможностью постоянно находиться в сообществе - общаться, развивать кругозор.
После практикума меня позвали в команду REBRAIN как одного из лучших выпускников. И это тоже очень крутой опыт. Сейчас я курирую практикум - отвечаю на вопросы ребят, вместе разбираем задачи, что помогает укреплять знания и разбираться в нюансах.
Сам формат практикума с упором именно на выполнение заданий - именно то, что нужно, чтобы сформировать достаточный кругозор и базис для развития. Так что, если тема DevOps или развития Operations вам близка - практикум это именно то, что нужно!
Ведущий инженер-программист
Большую часть своей карьеры я провел в админах. Сейчас догоняю знания - и по программированию, и по технологиям.
Почему выбрал Девопс? Так сошлись звезды. Эта сфера мне интересна, хочу в ней развиваться.
Когда выбирал практикум, сомнения были, и финансовые, и определенный скепсис к онлайн-формату. Поэтому присматривался к практикуму очень давно, был на бесплатных практикумах Василия Озерова. После них и решил, что это мое. К покупке подтолкнуло появление рассрочки, тогда и понял, что пора вкладываться в свое профессиональное развитие.
Практикум очень сильно нравится. Меня очень сильно заинтересовал формат. До этого был на курсах, где только лекции. А здесь именно практические занятия. Теория без практики - это ничто.
Начальных знаний для старта практикума хватило, влился быстро и мне было интересно.
Сейчас иногда удивляюсь людям, которые не нравится такой формат. Я наоборот рад, что нужно много копаться самому. Ищешь информацию и сам развиваешься в процессе поиска. Мне кажется, иначе ничего не запоминается и когда столкнешься с задачей в работе, начнешь все искать с “чистого листа”.
Замечательно, что в практикуме нет ограничения по времени и ограниченных сроков. Хотя кому-то это может быть сложно - ведь тут контролируешь себя сам.
Конечно, встречаются задачи, которые прямо не хочется делать. Ходишь вокруг нее день-два, а потом соберешься и делаешь за час. Если бывают какие-то недопонимания по заданиям, то кураторы всегда подскажут.
Из пожеланий - хотелось бы больше заданий по облакам, Google Cloud и Amazon Cloud.
Практикум прохожу с июня, сейчас прошел почти до конца. В сентябре ходил на собеседование на DevOps-инженера. Мне сказали, что нужно подтянуть знания по технологиям и английский язык. В январе сходил повторно и получил оффер на зарплату в два раза большую, чем у меня сейчас. Поэтому финансовыми вложениями в прохождение практикума доволен. Осталось получить 1 сертификат и буду переходить на новую работу.
Практикум подойдет админам и программистам, заинтересованным в автоматизации рутинных операций.
Системный администратор
Практикум DevOps by Rebrain выбрал по рекламе в Телеграме. Узнал про открытые практикумы, послушал, понравилась подача материала Василия. Кроме того, коллега проходил этот практикум, поспрашивал его, понравилось, что задачи идут последовательно.
Лучше практикумов я не видел. Доволен на 110%. За те деньги, что я заплатил, качество здоровское. Предоставляется намного больше, чем платишь. Чего стоит только доступ к облачным платформам (от знакомого слышал, что ему на одном из курсов сказали самому покупать доступ к облачной платформе).
Очень хорошо систематизирует знания то, что задачи идут последовательно, от простого к сложному. Кроме того, всегда можно написать вопрос куратору в Телеграм, он подскажет. SLA на проверку заданий полностью устраивает. На мой взгляд, аналогов практикума Rebrain на российском рынке нет.
Считаю, практикум будет полезен любому сисадмину, которому нравится разносторонняя работа.
DevOps-инженер в банке
Давно хотел попасть в DevOps, 5 лет работал в организации, проектирующей автомобильные дороги, но проектов под данную тематику не было. Три года назад, пришел работать в банк, но мечта так и оставалась мечтой, потому что на работе не было задач под нужный стек, а курсов как таковых не было, куда пришел и выучился, были материалы зарубежные и какие-то книжки.
Потом в банке начали появляться разработчики и я начал с ними активно взаимодействовать, мне было очень интересно с ними общаться и делать проекты, потому что это всегда технологии + ты еще можешь немного программировать.
Случайно набрал в интернете - курсы DevOps и увидел вас, не был ни на одном открытом практикуме, просто пошел на удачу, потому что понравился формат именно практики и были интересующие меня блоки - Dev и QA , достаточно полная и широкая программа. Причем если модуль разработки мне был знаком, то QA хотелось, но вообще не был знаком с автоматическим тестированием, а как оказалось все достаточно просто.
Так что да - для меня важна практика, в теории все хорошо, начинаешь сам делать и появляется много вопросов.
Я сейчас нахожусь на последнем модуле. В практикуме больше всего нравится широкий кругозор и упор именно на практику, решаешь реальные кейсы - получаешь опыт. Не дают готовых решений и приходится думать, а в этот момент как раз и появляется скилл.
Хотелось бы уточнить формулировку некоторых заданий (таких было 5-6), хотя если хорошо общаться с саппортом, то все окей. И еще хотелось бы сделать SLA меньше 24 часов.
Что было нового в практикуме? Да все оказалось новым, все очень ценное, все очень нужное и что самое главное применимо к работе. Я шел конкретно за знаниями и я их получил.
Это наверное самое долгое мое погружение в новую тему, если не считать универ, в этом есть свои плюсы и есть свои минусы, все хорошо укладывается в голову, хорошая логика построения и последовательность.
Практикум написан инженерами для будущих инженеров. Я рекомендую практикум системным администраторам, и я обратил внимание, что практически все кто выпустился с программы меняют работу или во время практикума, или после окончания и это хорошая возможность для тех кто хочет поменять профессию, без потери, или сразу с увеличением зарплаты.
или пройдите вступительный тест





Все задания, выполненные на практикуме, идут в ваше портфолио
45 000 руб.
50 000 руб.
4 500 руб/мес
5 000 руб.
14 дней
без объяснения причин
останется с вами навсегда
мы составим договор и отправим вам на согласование.
Общая стоимость
50 000 руб.
14 дней
без объяснения причин
останется с вами навсегда
-40% При приобретении нескольких программ,
получите скидку до 40% в личном кабинете
В 2018 году мы провели 3 потока по системе 2-3 лекции в неделю + домашка. Со всех 3-х потоков мы собирали обратную связь, чтобы сделать практикум более эффективным и удобным для пользователей. И в каждом потоке мы видели, что ребятам недостаточно практики. Как дело доходит до ДЗ, сразу же возникает куча вопросов и непонятно, как выполнить задание. Тогда мы и пришли к тому, что двигаемся от практики, но подкрепляем это лекционным форматом. Поэтому ответ - Да, мы считаем наш формат практикума самым эффективным и подходящим для всех. Если вдруг формат вам не подойдет, в первые две недели вы можете полностью вернуть средства без объяснения причин.
При загрузке 4-6 часов в неделю вы пройдете все задания за 2-3 месяца. Вы занимаетесь онлайн в удобное для вас время, без привязки к конкретной дате и получаете обратную связь кураторов по вашим заданиям в течение 24 часов. Смотреть теоретические видеоматериалы можно по очереди или все сразу.
Да, вы оплачиваете практикум полностью официально, с договором публичной оферты можно ознакомиться внизу страницы.
Мы предоставляем 2 рассрочки от банков-партнеров - Тинькофф и Альфа, у них идентичные условия: 0 рублей первоначальный взнос, ежемесячный платеж на 10 месяцев 3000 рублей (после окончания скидки – 3500 рублей), комиссий, штрафов и скрытых платежей нет. Все расходы на обслуживание мы берем на себя. Полностью внести остаток и закрыть рассрочку можно в любой момент, также без штрафов. Чтобы оформить рассрочку нажмите на кнопку «Рассрочка» в блоке «Стоимость».
Да, конечно, мы полностью белая организация. Для того, чтобы оплатить практикум от юридического лица, вам необходимо отправить ваши реквизиты с помощью формы «Плачу от организации» на сайте.
Мы понимаем, что мы все разные, и кому-то может не подойти наш формат, поэтому мы даем возможность в первые 14 дней практикума сделать возврат средств без объяснения причин. Причем вернуть можно и при единовременной оплате и при оформлении рассрочки от банка.
Да, вы проходите задания на нашей инфраструктуре. Вам не потребуется ничего докупать дополнительно.