Последние посты

PRO Go
21 сент., 06:52
#memes
PRO Go
14 сент., 06:01
#memes
PRO Go
13 сент., 09:16
Сегодня 256-й день года — а значит, День программиста 🎉256 — это 2⁸, ровно столько значений помещается в один байт. Забавно, что праздник выбрали именно так: не по календарю, а по степени двойки. Очень в духе профессии.Хочу поздравить всех, кто сегодня читает этот канал — и тех, кто уже пишет на Go, и тех, кто только присматривается. Отдельный привет тем, кто прямо сейчас откладывает баг на разберусь завтра — мы все так делали, и ничего, живы.Пусть err почаще будет nil, горутины не текут, а go build с первого раза показывает заветное ничего не выведено — значит, всё скомпилировалось 😄С праздником! Спасибо, что вы рядом ❤️
PRO Go
10 сент., 08:30изменён
Про гонки данных🏁Есть у конкурентности особый сорт багов, после которых хочется закрыть ноутбук и пойти погулять. Тесты зелёные, локально всё сходится. А потом приходит отчёт с прода, и сумма в нём меньше, чем должна быть. Не вдвое, а вот на чуть-чуть, будто пара операций куда-то потерялась по дороге. Они и правда потерялись.Дело в том, что counter++ только выглядит как одно действие. На самом деле это прочитать, прибавить, записать обратно. И если между «прочитать» и «записать» в ту же переменную успела влезть соседняя горутина, её работа затирается. Без ошибки и без паники.Обиднее всего, что повторить это специально почти нереально. Запускаешь двадцать раз, двадцать раз всё хорошо. Поэтому такие штуки спокойно живут в проекте месяцами и вылезают в самый неподходящий момент.Но ловить их Go умеет сам: go test -raceОн расставляет проверки и
PRO Go
8 сент., 11:15
Про sync.WaitGroup⏳В прошлый раз остановились на неприятном: горутину запустили, а main закончился раньше, чем она успела хоть что-то сделать. Сегодня про то, как это лечится по-человечески.Первое, что приходит в голову — заткнуть дыру задержкой.time.Sleep(time.Second)Работает ровно до того дня, когда сеть притормозит и секунды не хватит. А если поставить запас побольше, программа будет честно стоять на месте даже тогда, когда всё давно готово. Гадание, а не синхронизация.Нормальный инструмент называется sync.WaitGroup. По сути это счётчик горутин, которых мы ждём.var wg sync.WaitGroupfor _, city := range cities { wg.Add(1) go func(city string) { defer wg.Done() fetchWeather(city) }(city)
PRO Go
7 сент., 06:01
#memes
PRO Go
5 сент., 09:22изменён
Про горутины🔨Раз уж завёл новый модуль, «Конкурентность», грех не рассказать, что в нём внутри, чуть подробнее, чем влезает в одну строчку анонса. Начну с первой главы — она про горутины, и с них, по-хорошему, начинается сам Go как язык для параллельной работы.Горутина — это кусок кода, который выполняется не по очереди с остальной программой, а сам по себе, параллельно. Обычно код идёт строка за строкой, одна дожидается другой. Горутина — способ сказать «а вот эта часть пусть работает отдельно, не жди её, иди дальше».В большинстве языков, чтобы так сделать, нужен отдельный объект-поток, пул под него, настройки размера — в общем, дело. В Go для этого есть одно слово. go fetchWeather("Москва") go fetchWeather("Питер")Вот и всё, обе функции побежали сами по себе, а рантайм сам разложит их по реальным ядрам процессора. И не только эти две — тысячи


PRO Go
3 сент., 12:51изменён
🧙 Свершилось то, чего многие ждали. В курсе PRO Go. Для продвинутых появился новый модуль Конкурентность.Семь уроков про то, как заставить программу делать несколько дел одновременно и не получить в ответ кашу. Горутины, WaitGroup, гонки данных, мьютексы, каналы, select и context.Начинается всё с классики: запустил горутины, программа честно отработала, а в результате нули. Потом выясняется, что данные, к которым лезут сразу с нескольких сторон, портятся молча и далеко не при каждом запуске, из-за этого такие баги и живут в проекте месяцами. Ближе к концу разбираемся, как всю эту параллельную работу вовремя останавливать, если результат уже никому не нужен.Практики привычно много: 78 заданий, 30 из них на написание кода с нуля. Ну и схемы с разборами ловушек, куда без них.И ещё бонус, раз всё так совпало. В честь начала учебного года и выхода
PRO Go
31 авг., 05:32
🕺💃🕺💃#memes
PRO Go
30 авг., 10:43
Вышло новое обновление курса PRO Go для продвинутых — добавили сразу три главы, и это, кажется, одна из самых практичных тем во всём курсе. Разбираемся, как писать тесты, которые ловят баги, а не просто существуют для галочки. Пройдём путь от самого первого
PRO Go
28 авг., 06:23
Вышло новое обновление курса PRO Go для продвинутых — добавили сразу три главы, и это, кажется, одна из самых практичных тем во всём курсе.Разбираемся, как писать тесты, которые ловят баги, а не просто существуют для галочки. Пройдём путь от самого первого теста до приёмов, которыми пользуются в боевых проектах, когда код завязан на что-то внешнее — например, на сервис в интернете, который нельзя дёргать в каждом тестовом запуске.Без спойлеров — но после этих глав по-другому смотришь на то, что значит код, в который можно спокойно вносить изменения и ничего не сломать.Как обычно — на каждую тему есть и лекция, и куча заданий на закрепление: квизы, сопоставления, задачи на программирование.Тем, кто уже в процессе — удачи с новыми главами, вы отлично держите темп 💪Тем, кто ещё присматривается — самое время начать! Не забывайте, что для всех тех, кто прошел PRO Go Основы
PRO Go
24 авг., 11:07
Советуем)))#memes


PRO Go
20 авг., 13:01
Вышел Go 1.27 ❤️Вчера команда языка выпустила новую версию. Почти всё старое продолжит работать, а внутри есть несколько приятных обновлений.Главное, чего многие ждали ещё с появления дженериков: теперь методы тоже могут иметь свои типовые параметры. Раньше для этого приходилось выносить функции на уровень пакета, теперь можно писать ближе к самому типу.Ещё из того, что сразу заметно: • появился encoding/json/v2 • в стандартной библиотеке есть пакет uuid • маленькие объекты стали аллоцироваться быстрееЕсли хочется посмотреть своими глазами — вот официальный пост⬇️ Скачать go 1.27
PRO Go
18 авг., 16:31
У нас по традиции каждый месяц действует 😱скидка на один из курсов, и в августе она открыта на PRO Go. Базовый курс по структурам данных — отличный шанс для тех, кто давно хотел подтянуть фундамент.Курс поможет разобраться, как устроены основные структуры данных и почему они работают именно так. Вы поймёте логику массивов, списков, стеков, очередей, хеш‑таблиц и множеств, научитесь реализовывать их своими руками и применять в реальных задачах.И есть приятный бонус: каждый ученик, который прошёл курс PRO Go. Основы программирования, может получить увеличенную скидку — просто напишите мне о своём успешном прохождении.Успехов в обучении! 👋
PRO Go
17 авг., 06:37
#memes
PRO Go
16 авг., 09:42
Друзья, всем привет 👾 Как и обещал, курс PRO Go для продвинутых постоянно развивается и обновляется. Сегодня в нём появилось новое дополнение — модуль «Стиль и архитектура». В этом блоке вы научитесь выстраивать структуру проекта, понимать принципы модульности, а также применять архитектурные подходы.🔨 И, конечно, на этом мы не останавливаемся — уже совсем скоро вас ждут новые обновления и свежие главы. Тем, кто уже проходит курс, желаю приятного изучения, а тем, кто ещё думает — самое время присоединиться. Совсем скоро будет ещё интереснее 🏴☠️
PRO Go
15 авг., 06:19
🤓 Когда пишешь тесты, рано или поздно появляется желание вынести повторяющийся код в маленькую вспомогательную функцию. Типа: func check(t testing.T, got, want float64) { if got != want { t.Errorf("получили %v, хотели %v", got, want) } } И всё бы хорошо, но есть один нюанс: если эта функция лежит рядом с тестами, но не начинается с Test, Go считает её обычным кодом. А вот если она вызывает t.Errorf или t.Fatalf, то в выводе тестов будет написано, что ошибка произошла… внутри этой вспомогательной функции.То есть вместо: TestTemperatureConversions: ToFahrenheit(100) = 212, хотели 200мы получаем что‑то вроде: check: ToFahrenheit(100) = 212, хотели 200И вот тут Goшка делает маленький, но очень приятный трюк. Если пометить такую функцию как t.Helper(), он перестаёт винить её в ошибке и переносит ответственность обратно на вызывающий тест. То есть
PRO Go
10 авг., 08:06
#memes
PRO Go
7 авг., 13:34
Совсем скоро в курсе PRO для продвинутых откроем тему тестирования, и на табличных тестах — той самой конструкции, когда пачку проверок гоняют одним циклом вместо кучи отдельных функций — наткнулись на мелочь, которая неплохо объясняет, как Go относится к таким вещам.Если в тестовой таблице у двух разных случаев случайно оказалось одинаковое имя — Go не упадёт с ошибкой и не перепутает их между собой. Он просто сам различит подтесты, добавив к повторяющемуся имени суффикс: TestToFahrenheit/case TestToFahrenheit/case#01 TestToFahrenheit/case#02Ничего не сломается, всё запустится и отработает как надо. Но появление #01 в выводе — это, по сути, тихий сигнал от компилятора: у тебя тут копипаста, ты забыл поправить название после того, как скопировал строку таблицы Технической ошибки нет, а вот сигнал для читающего код есть, и довольно явный.Забавно, что язык в принципе не обязан был
PRO Go
3 авг., 10:27
Сеньор бэкендер после 10 лет в IT#memes
