PRO Go
الذهاب إلى القناة على Telegram
Изучай язык Go вместе с нами. Закрепить теорию на практике можно на курсе - https://stepik.org/a/158385/pay?promo=0dbf5c609937c00c Подготовится к собеседованиям - https://stepik.org/a/205199/pay?promo=06f35ce5ae028fa2 По всем вопросам: @Santiago_de
إظهار المزيد3 311
المشتركون
لا توجد بيانات24 ساعات
-97 أيام
-2730 أيام
جاري تحميل البيانات...
القنوات المماثلة
سحابة العلامات
الإشارات الواردة والصادرة
---
---
---
---
---
---
جذب المشتركين
سبتمبر '26
سبتمبر '26
+9
في 0 قنوات
أغسطس '26
+13
في 0 قنوات
Get PRO
يوليو '26
+15
في 0 قنوات
Get PRO
يونيو '26
+21
في 0 قنوات
Get PRO
مايو '26
+26
في 1 قنوات
Get PRO
أبريل '26
+44
في 0 قنوات
Get PRO
مارس '26
+21
في 0 قنوات
Get PRO
فبراير '26
+31
في 0 قنوات
Get PRO
يناير '26
+53
في 2 قنوات
Get PRO
ديسمبر '25
+38
في 0 قنوات
Get PRO
نوفمبر '25
+81
في 1 قنوات
Get PRO
أكتوبر '25
+103
في 0 قنوات
Get PRO
سبتمبر '25
+97
في 0 قنوات
Get PRO
أغسطس '25
+92
في 0 قنوات
Get PRO
يوليو '25
+145
في 0 قنوات
Get PRO
يونيو '25
+95
في 0 قنوات
Get PRO
مايو '25
+115
في 0 قنوات
Get PRO
أبريل '25
+121
في 0 قنوات
Get PRO
مارس '25
+184
في 0 قنوات
Get PRO
فبراير '25
+149
في 0 قنوات
Get PRO
يناير '25
+201
في 0 قنوات
Get PRO
ديسمبر '24
+261
في 0 قنوات
Get PRO
نوفمبر '24
+138
في 2 قنوات
Get PRO
أكتوبر '24
+181
في 2 قنوات
Get PRO
سبتمبر '24
+157
في 0 قنوات
Get PRO
أغسطس '24
+177
في 3 قنوات
Get PRO
يوليو '24
+234
في 2 قنوات
Get PRO
يونيو '24
+243
في 2 قنوات
Get PRO
مايو '24
+259
في 0 قنوات
Get PRO
أبريل '24
+258
في 0 قنوات
Get PRO
مارس '24
+288
في 0 قنوات
Get PRO
فبراير '24
+224
في 0 قنوات
Get PRO
يناير '24
+164
في 0 قنوات
Get PRO
ديسمبر '23
+173
في 2 قنوات
Get PRO
نوفمبر '23
+118
في 1 قنوات
Get PRO
أكتوبر '23
+9
في 0 قنوات
Get PRO
سبتمبر '23
+203
في 0 قنوات
Get PRO
أغسطس '23
+1 043
في 0 قنوات
| التاريخ | نمو المشتركين | الإشارات | القنوات | |
| 18 سبتمبر | 0 | |||
| 17 سبتمبر | 0 | |||
| 16 سبتمبر | +1 | |||
| 15 سبتمبر | 0 | |||
| 14 سبتمبر | +1 | |||
| 13 سبتمبر | 0 | |||
| 12 سبتمبر | 0 | |||
| 11 سبتمبر | 0 | |||
| 10 سبتمبر | +1 | |||
| 09 سبتمبر | +1 | |||
| 08 سبتمبر | +2 | |||
| 07 سبتمبر | 0 | |||
| 06 سبتمبر | +1 | |||
| 05 سبتمبر | 0 | |||
| 04 سبتمبر | 0 | |||
| 03 سبتمبر | +1 | |||
| 02 سبتمبر | +1 | |||
| 01 سبتمبر | 0 |
منشورات القناة
| 2 | لا يوجد نص... | 1 |
| 3 | Сегодня 256-й день года — а значит, День программиста 🎉
256 — это 2⁸, ровно столько значений помещается в один байт. Забавно, что праздник выбрали именно так: не по календарю, а по степени двойки. Очень в духе профессии.
Хочу поздравить всех, кто сегодня читает этот канал — и тех, кто уже пишет на Go, и тех, кто только присматривается. Отдельный привет тем, кто прямо сейчас откладывает баг на разберусь завтра — мы все так делали, и ничего, живы.
Пусть err почаще будет nil, горутины не текут, а go build с первого раза показывает заветное ничего не выведено — значит, всё скомпилировалось 😄
С праздником! Спасибо, что вы рядом ❤️ | 361 |
| 4 | Про гонки данных🏁
Есть у конкурентности особый сорт багов, после которых хочется закрыть ноутбук и пойти погулять. Тесты зелёные, локально всё сходится. А потом приходит отчёт с прода, и сумма в нём меньше, чем должна быть. Не вдвое, а вот на чуть-чуть, будто пара операций куда-то потерялась по дороге.
Они и правда потерялись.
Дело в том, что counter++ только выглядит как одно действие. На самом деле это прочитать, прибавить, записать обратно. И если между «прочитать» и «записать» в ту же переменную успела влезть соседняя горутина, её работа затирается. Без ошибки и без паники.
Обиднее всего, что повторить это специально почти нереально. Запускаешь двадцать раз, двадцать раз всё хорошо. Поэтому такие штуки спокойно живут в проекте месяцами и вылезают в самый неподходящий момент.
Но ловить их Go умеет сам: go test -race
Он расставляет проверки и прямо показывает, какие горутины полезли в одну память и в каких строчках. Первый запуск -race на своём проекте — обычно смешанные ощущения, потому что почти всегда там находится что-то, о чём ты не подозревал.
Про все это вы узнаете в курсе PRO Go Для продвинутых. Скидка 20% до конца этого дня, поспешите ❤️ | 469 |
| 5 | Про sync.WaitGroup⏳
В прошлый раз остановились на неприятном: горутину запустили, а main закончился раньше, чем она успела хоть что-то сделать. Сегодня про то, как это лечится по-человечески.
Первое, что приходит в голову — заткнуть дыру задержкой.
time.Sleep(time.Second)
Работает ровно до того дня, когда сеть притормозит и секунды не хватит. А если поставить запас побольше, программа будет честно стоять на месте даже тогда, когда всё давно готово. Гадание, а не синхронизация.
Нормальный инструмент называется sync.WaitGroup. По сути это счётчик горутин, которых мы ждём.
var wg sync.WaitGroup
for _, city := range cities {
wg.Add(1)
go func(city string) {
defer wg.Done()
fetchWeather(city)
}(city)
}
wg.Wait()
Три метода, и на этом всё. Add(1) — добавили горутину, которую надо дождаться. Done() — эта закончила, счётчик минус один. Wait() — стоим здесь, пока счётчик не обнулится.
Приятная мелочь: var wg sync.WaitGroup уже готов к работе, никаких New и инициализаций. Нулевое значение и есть рабочее, в Go так устроено много чего.
defer перед wg.Done() тоже не для красоты. Если внутри горутины случится паника или ранний return, Done без defer просто не вызовется, счётчик никогда не дойдёт до нуля, и Wait будет ждать вечно. Причём программа не упадёт с ошибкой, а именно зависнет — отдельное удовольствие ловить такое в проде.
Ну и главная ловушка, на которой спотыкаются почти все. Add обязан стоять до go, а не внутри горутины.
go func() {
wg.Add(1) // так нельзяdefer wg.Done()
...
}()
Выглядит-то логично, горутина сама себя посчитала. Но main в этот момент бежит дальше и вполне может добраться до Wait раньше, чем горутина вообще стартует и что-то прибавит. Счётчик ноль, Wait решает, что ждать некого, программа идёт дальше без результатов — то есть мы вернулись ровно к той проблеме, с которой начинали, только теперь она замаскирована правильно выглядящим кодом.
Как выглядит счётчик по шагам, почему порядок завершения горутин не важен, и что делать, когда горутин заранее неизвестно сколько — всё это в модуле, там же задания, где это надо написать руками и посмотреть, как оно себя ведёт.
Напоминаю, что скидка 20% на курс PRO Go Для продвинутых всё ещё действует, но остаётся всего два дня❤️ | 447 |
| 6 | #memes | 455 |
| 7 | Про горутины🔨
Раз уж завёл новый модуль, «Конкурентность», грех не рассказать, что в нём внутри, чуть подробнее, чем влезает в одну строчку анонса. Начну с первой главы — она про горутины, и с них, по-хорошему, начинается сам Go как язык для параллельной работы.
Горутина — это кусок кода, который выполняется не по очереди с остальной программой, а сам по себе, параллельно. Обычно код идёт строка за строкой, одна дожидается другой. Горутина — способ сказать «а вот эта часть пусть работает отдельно, не жди её, иди дальше».
В большинстве языков, чтобы так сделать, нужен отдельный объект-поток, пул под него, настройки размера — в общем, дело. В Go для этого есть одно слово.
go fetchWeather("Москва")
go fetchWeather("Питер")
Вот и всё, обе функции побежали сами по себе, а рантайм сам разложит их по реальным ядрам процессора. И не только эти две — тысячи горутин запросто уживаются там, где обычная ОС-шная нить уже давно бы легла. Горутина занимает пару килобайт стека, который при необходимости растёт, а не фиксированные мегабайты, как у настоящего потока, поэтому «запустить ещё одну» почти ничего не стоит.
Нюанс в том, что «запустить» и «дождаться» — это разные глаголы. Горутина не «выполнись прямо сейчас», а «выполнись, когда получится, а мы пока пойдём дальше».
func main() {
go fetchWeather("Москва")
}
// main уже закончился, а горутина, скорее всего, даже не успела стартовать
Если её явно не дождаться, main может преспокойно закончиться раньше, чем горутина хоть что-то сделает — и в результате тишина вместо данных.
Про то, как её правильно ждать (и что будет, если сделать это неправильно), — в новом модуле курса, PRO Go для продвинутых.
В честь начала учебного года и выхода модуля дарю вам скидку 20% на курс🌈. Скидка действует ровно неделю. | 497 |
| 8 | 🧙 Свершилось то, чего многие ждали. В курсе PRO Go. Для продвинутых появился новый модуль Конкурентность.
Семь уроков про то, как заставить программу делать несколько дел одновременно и не получить в ответ кашу. Горутины, WaitGroup, гонки данных, мьютексы, каналы, select и context.
Начинается всё с классики: запустил горутины, программа честно отработала, а в результате нули. Потом выясняется, что данные, к которым лезут сразу с нескольких сторон, портятся молча и далеко не при каждом запуске, из-за этого такие баги и живут в проекте месяцами. Ближе к концу разбираемся, как всю эту параллельную работу вовремя останавливать, если результат уже никому не нужен.
Практики привычно много: 78 заданий, 30 из них на написание кода с нуля. Ну и схемы с разборами ловушек, куда без них.
И ещё бонус, раз всё так совпало. В честь начала учебного года и выхода модуля дарю вам скидку 20% на курс (действие скидки действует ровно неделю).
Удачи в изучении ❤️ | 579 |
| 9 | 🕺💃🕺💃
#memes | 719 |
| 10 | Решил постараться для вас и порадовать ещё одним обновлением курса PRO Go для продвинутых — модуль про тестирование вырос ещё на четыре главы 🥺
Продолжаем тему с прошлого раза. Теперь курс учит не просто писать тесты, а по-настоящему им доверять.
Разбираем покрытие тестами — как понять, какие ветки кода вообще ни разу не выполнялись, и почему зелёный PASS ещё ничего не гарантирует.
Дальше учимся измерять, а не гадать: бенчмарки показывают, что стало быстрее или медленнее, а профилирование — в какой именно функции реально тратится время (спойлер, часто не там, где кажется).
И закрываем тему гигиеной — как аккуратно готовить и убирать за тестами, чтобы они не мешали друг другу.
Как обычно — на каждую тему есть и лекция, и куча заданий на закрепление.
Удачи в изучении ❤️ | 732 |
| 11 | Вышло новое обновление курса PRO Go для продвинутых — добавили сразу три главы, и это, кажется, одна из самых практичных тем во всём курсе.
Разбираемся, как писать тесты, которые ловят баги, а не просто существуют для галочки. Пройдём путь от самого первого теста до приёмов, которыми пользуются в боевых проектах, когда код завязан на что-то внешнее — например, на сервис в интернете, который нельзя дёргать в каждом тестовом запуске.
Без спойлеров — но после этих глав по-другому смотришь на то, что значит код, в который можно спокойно вносить изменения и ничего не сломать.
Как обычно — на каждую тему есть и лекция, и куча заданий на закрепление: квизы, сопоставления, задачи на программирование.
Тем, кто уже в процессе — удачи с новыми главами, вы отлично держите темп 💪
Тем, кто ещё присматривается — самое время начать! Не забывайте, что для всех тех, кто прошел PRO Go Основы программирования, есть скидка. Что бы её получить, вам нужно всего лишь написать мне)
Спасибо, что вы рядом ❤️ | 712 |
| 12 | Советуем)))
#memes | 728 |
| 13 | Вышел Go 1.27 ❤️
Вчера команда языка выпустила новую версию. Почти всё старое продолжит работать, а внутри есть несколько приятных обновлений.
Главное, чего многие ждали ещё с появления дженериков: теперь методы тоже могут иметь свои типовые параметры. Раньше для этого приходилось выносить функции на уровень пакета, теперь можно писать ближе к самому типу.
Ещё из того, что сразу заметно:
• появился encoding/json/v2
• в стандартной библиотеке есть пакет uuid
• маленькие объекты стали аллоцироваться быстрее
Если хочется посмотреть своими глазами — вот официальный пост
⬇️ Скачать go 1.27 | 860 |
| 14 | У нас по традиции каждый месяц действует 😱скидка на один из курсов, и в августе она открыта на PRO Go. Базовый курс по структурам данных — отличный шанс для тех, кто давно хотел подтянуть фундамент.
Курс поможет разобраться, как устроены основные структуры данных и почему они работают именно так. Вы поймёте логику массивов, списков, стеков, очередей, хеш‑таблиц и множеств, научитесь реализовывать их своими руками и применять в реальных задачах.
И есть приятный бонус: каждый ученик, который прошёл курс PRO Go. Основы программирования, может получить увеличенную скидку — просто напишите мне о своём успешном прохождении.
Успехов в обучении! 👋 | 908 |
| 15 | #memes | 928 |
| 16 | Друзья, всем привет 👾
Как и обещал, курс PRO Go для продвинутых постоянно развивается и обновляется. Сегодня в нём появилось новое дополнение — модуль «Стиль и архитектура». В этом блоке вы научитесь выстраивать структуру проекта, понимать принципы модульности, а также применять архитектурные подходы.
🔨 И, конечно, на этом мы не останавливаемся — уже совсем скоро вас ждут новые обновления и свежие главы. Тем, кто уже проходит курс, желаю приятного изучения, а тем, кто ещё думает — самое время присоединиться.
Совсем скоро будет ещё интереснее 🏴☠️ | 767 |
| 17 | 🤓 Когда пишешь тесты, рано или поздно появляется желание вынести повторяющийся код в маленькую вспомогательную функцию.
Типа:
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(), он перестаёт винить её в ошибке и переносит ответственность обратно на вызывающий тест. То есть сообщение снова будет привязано к конкретному тесту, а не к технической обёртке.
Это не обязательно. Ну ты сам вынес проверку в отдельную функцию — сам и разбирайся. Но go делает наоборот: помогает сохранить читаемость, не ломает вывод, не заставляет нас прыгать по стеку вызовов, чтобы понять, где именно упал тест.
И это очень в духе Go: не усложнять, не заставлять писать лишний код, и при этом аккуратно подчищать за нами, чтобы результат был понятным.
Такие мелочи редко обсуждают в учебниках, но именно они создают ощущение, что язык не просто строгий, а доброжелательный 😩 | 683 |
| 18 | #memes | 736 |
| 19 | Совсем скоро в курсе PRO для продвинутых откроем тему тестирования, и на табличных тестах — той самой конструкции, когда пачку проверок гоняют одним циклом вместо кучи отдельных функций — наткнулись на мелочь, которая неплохо объясняет, как Go относится к таким вещам.
Если в тестовой таблице у двух разных случаев случайно оказалось одинаковое имя — Go не упадёт с ошибкой и не перепутает их между собой. Он просто сам различит подтесты, добавив к повторяющемуся имени суффикс:
TestToFahrenheit/case
TestToFahrenheit/case#01
TestToFahrenheit/case#02
Ничего не сломается, всё запустится и отработает как надо. Но появление #01 в выводе — это, по сути, тихий сигнал от компилятора:
у тебя тут копипаста, ты забыл поправить название после того, как скопировал строку таблицы
Технической ошибки нет, а вот сигнал для читающего код есть, и довольно явный.
Забавно, что язык в принципе не обязан был это разруливать — мог бы просто требовать уникальные имена и ругаться. Но вместо этого выбрал более дружелюбный путь: не мешать работе, но оставить маленький след, по которому потом можно найти небрежность 🙂 | 728 |
| 20 | Сеньор бэкендер после 10 лет в IT
#memes | 839 |
