PRO Go
СтатистикаИзучай язык Go вместе с нами. Закрепить теорию на практике можно на курсе - https://stepik.org/a/158385/pay?promo=0dbf5c609937c00c Подготовится к собеседованиям - https://stepik.org/a/205199/pay?promo=06f35ce5ae028fa2 По всем вопросам: @Santiago_de
- Последний пост
- 11:42
- Последнее чтение
- 15:23
- Постов за неделю
- 3
- Всего постов
- 29
- Тип
- открытый
- Язык
- русский
- Категория
- Технологии (по похожим)
- В каталоге с
- 12 авг.
- 1/24сутки в ленте
- 323
- 1/48двое суток
- 370
- 1/72трое суток
- 399
Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.
Посты
Друзья, всем привет 👾 Как и обещал, курс PRO Go для продвинутых постоянно развивается и обновляется. Сегодня в нём появилось новое дополнение — модуль «Стиль и архитектура». В этом блоке вы научитесь выстраивать структуру проекта, понимать принципы модульности, а также применять архитектурные подходы. 🔨 И, конечно, на этом мы не останавливаемся — уже совсем скоро вас ждут новые обновления и свежие главы. Тем, кто уже проходит курс, желаю приятного изучения, а тем, кто ещё думает — самое время присоединиться. Совсем скоро будет ещё интереснее 🏴☠️
🤓 Когда пишешь тесты, рано или поздно появляется желание вынести повторяющийся код в маленькую вспомогательную функцию. Типа: 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: не усложнять, не заставлять писать лишний код, и при этом аккуратно подчищать за нами, чтобы результат был понятным. Такие мелочи редко обсуждают в учебниках, но именно они создают ощущение, что язык не просто строгий, а доброжелательный 😩
#memes
Совсем скоро в курсе PRO для продвинутых откроем тему тестирования, и на табличных тестах — той самой конструкции, когда пачку проверок гоняют одним циклом вместо кучи отдельных функций — наткнулись на мелочь, которая неплохо объясняет, как Go относится к таким вещам. Если в тестовой таблице у двух разных случаев случайно оказалось одинаковое имя — Go не упадёт с ошибкой и не перепутает их между собой. Он просто сам различит подтесты, добавив к повторяющемуся имени суффикс: TestToFahrenheit/case TestToFahrenheit/case#01 TestToFahrenheit/case#02 Ничего не сломается, всё запустится и отработает как надо. Но появление #01 в выводе — это, по сути, тихий сигнал от компилятора: у тебя тут копипаста, ты забыл поправить название после того, как скопировал строку таблицы Технической ошибки нет, а вот сигнал для читающего код есть, и довольно явный. Забавно, что язык в принципе не обязан был это разруливать — мог бы просто требовать уникальные имена и ругаться. Но вместо этого выбрал более дружелюбный путь: не мешать работе, но оставить маленький след, по которому потом можно найти небрежность 🙂
Сеньор бэкендер после 10 лет в IT #memes
Сейчас в курсе PRO для продвинутых разбираем главу о том, как разносить логику по разным пакетам внутри одного проекта, и наткнулись на ситуацию, которая в других языках прошла бы незамеченной, а в Go встаёт стеной. Представим два пакета: length и weight. Кто-то в length решил дёрнуть функцию из weight, а кто-то в weight — наоборот, дёрнуть что-то из length. Мелочь, бывает. package length import "weight" package weight import "length" И вот тут Go просто отказывается собирать проект. Не с предупреждением, а с полной остановкой: чтобы собрать length, нужен уже собранный weight, а чтобы собрать weight — уже собранный length. Круг замкнулся, и компилятор физически не может решить, с чего начать. В динамических языках такое часто прокатывает — код может работать, пока в реальном сценарии не наступит момент, когда порядок вызовов сыграет плохую шутку. Go же вообще не даёт дойти до этого момента: он ловит цикл на этапе сборки, до всякого запуска. Немного занудно как ограничение, но зато потом никогда не приходится дебажить загадочное поведение из-за пакетов, которые тайно зависят друг от друга по кругу 🔨
Когда в твоей программе есть баг, но она всё равно работает как надо
Пока разбираем частичку новой главы про пакеты курса PRO для продвинутых, наткнулись на штуку, которая почти всегда удивляет тех, кто пришёл из других языков. В большинстве языков есть отдельные слова для того, что можно, а что нельзя использовать снаружи — public, private, protected. В Goшке этого нет вообще. Всё решает одна буква. func Area(w, h float64) float64 { ... } func area(w, h float64) float64 { ... } Area — с большой буквы — будет видна из любого другого пакета проекта. area — с маленькой — останется доступна только внутри своего пакета, и снаружи её просто не существует. Никаких аннотаций, ключевых слов и конфигураций. Регистр первой буквы — и есть вся система видимости 🙂
#memes
13 июля родился Эрнё Рубик — человек, подаривший миру тот самый кубик. В честь этого сегодня во всем мире отмечают День головоломки. Разгадывание логических задач — это не просто классное хобби. Сегодня это мощный карьерный инструмент. Знаете, что объединяет собеседования в Google, Яндексе и топовых банках? Там обожают проверять кандидатов каверзными логическими задачами. Работодателям важно увидеть, как именно вы мыслите, и умение распутывать такие ребусы на ходу — суперсила, за которую готовы платить. Весь оставшийся месяц будет действовать скидка 10%, поэтому скорее переходите по ссылке, активируйте выгоду и прокачивайте интеллект для будущих карьерных побед!
#memes
Мы начинаем новую главу курса PRO для продвинутых, и она будет посвящена тому, как писать код, который приятно читать — не только тебе, но и любому, кто откроет его после. 🤓 Будем говорить о том, как сделать код понятным, аккуратным и живым: где стоит упростить, где структурировать, а где просто остановиться и подумать, прежде чем добавить ещё одну строчку. По ходу работы я буду делиться фрагментами и наблюдениями — уверен, многим будет интересно заглянуть в процесс. Спасибо, что вы рядом ❤️
#memes
Последние дни я позволил себе немного замедлиться, отдохнуть и прийти в себя. Иногда такая пауза нужна, чтобы снова почувствовать вкус к работе. За этот короткий период было много приятных моментов, и честно говоря, в такую жару работать — последнее желание. Но я возвращаюсь в свой темп и уже готовлюсь к новой главе для нашего курса PRO для продвинутых. Для тех, кто сейчас проходит курс — это будет хорошей новостью. А для тех, кто ещё думает — повод присоединиться. По ходу работы буду делиться с вами кусочками новой главы и результатами. Обнимаю всех, вы у меня самые лучшие ❤️
🎲 Перетасовка: алгоритм Фишера–Йетса Есть такая функция rand.Shuffle, которая умеет перемешивать срезы. Она принимает количество элементов и колбэк, который меняет местами два значения: nums := []int{1, 2, 3, 4, 5} rand.Shuffle(len(nums), func(i, j int) { nums[i], nums[j] = nums[j], nums[i] }) fmt.Println(nums) // [3 1 5 2 4] Но внутри всё не так просто — чтобы перемешивание было действительно случайным, используется алгоритм Фишера–Йетса. Он идёт с конца массива и на каждом шаге выбирает случайный индекс, с которым нужно поменяться: func Shuffle[T any](s []T) { for i := len(s) - 1; i > 0; i-- { j := rand.IntN(i + 1) s[i], s[j] = s[j], s[i] } } Каждый элемент получает равный шанс оказаться где угодно — без перекосов и повторов. letters := []string{"A", "B", "C", "D", "E"} Shuffle(letters) fmt.Println(letters) // [C E A D B] И всё — три строчки, а результат честно случайный. Такой же принцип используют и другие языки, просто под капотом. Там тоже идёт тот же самый проход с конца и выбор случайного индекса на каждом шаге — только мы этого не видим, потому что всё спрятано в стандартной функции. Но логика одна и та же: пройтись по массиву, каждый раз менять местами текущий элемент со случайным.
#memes
#memes
🤓Теперь slog может писать логи в несколько мест одновременно В Go 1.26 появилась удобная штука: можно отправлять одну и ту же запись лога сразу в несколько мест. Например: выводить в консоль, сохранять в файл и параллельно отправлять куда‑то ещё. Раньше для этого приходилось писать свою обвязку. Теперь — просто подключаешь несколько обработчиков и объединяешь их. У slog есть новый механизм — MultiHandler. Он берёт вашу запись лога и передаёт её всем хендлерам, которые вы ему дали. 🤓 Допустим, хотим: в консоль — обычный текст в файл — структурированный JSON Создаём хендлер для консоли: console := slog.NewTextHandler(os.Stdout, nil) Создаём хендлер для файла: f, _ := os.OpenFile("server.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) file := slog.NewJSONHandler(f, nil) Теперь объединяем: multi := slog.NewMultiHandler(console, file) log := slog.New(multi) И дальше просто логируем: log.Info("user connected", slog.String("ip", "192.168.1.10"), slog.Int("port", 8080), )
#memes
🏴☠️ Cегодня очередь курса, который любят те, кто хочет прокачать мышление, а не только код. 🧩 PRO Логические задачи — это тренажёр для мозга, который помогает развивать аналитическое мышление, внимательность, умение раскладывать сложные задачи на простые шаги. То, что напрямую влияет на качество кода, скорость решения задач и уверенность на собеседованиях. Внутри курса — десятки логических задач разного уровня: от классических головоломок до задач, которые требуют аккуратного анализа, поиска закономерностей и умения держать в голове несколько условий одновременно. Каждая задача разобрана так, чтобы вы не просто нашли ответ, а поняли ход мысли. Это отличный курс, если вы хотите: -прокачать структурное мышление -научиться видеть решение там, где оно неочевидно -подготовиться к собеседованиям -просто получать удовольствие от задач, которые приятно ломать И сейчас на курс действует скидка по весенней распродаже. А если хотите сделать её ещё больше, просто напишите вашему наставнику. ❤️ Написать наставнику