tgindex
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 авг.
Подписчики
3 335
−1 за 4 дн.
Сутки
0
0,00%
Неделя
 
Месяц
 
Просмотров на пост
865
28 постов
Вовлечённость
25,9%
к подписчикам
Постов в день
0,4
всего 29
Упоминаний
1
каналов
Охват размещения
оценка
1/24сутки в ленте
323
1/48двое суток
370
1/72трое суток
399

Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.

Посты

  • 11:4215761

    Друзья, всем привет 👾 Как и обещал, курс 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 в выводе — это, по сути, тихий сигнал от компилятора: у тебя тут копипаста, ты забыл поправить название после того, как скопировал строку таблицы Технической ошибки нет, а вот сигнал для читающего код есть, и довольно явный. Забавно, что язык в принципе не обязан был это разруливать — мог бы просто требовать уникальные имена и ругаться. Но вместо этого выбрал более дружелюбный путь: не мешать работе, но оставить маленький след, по которому потом можно найти небрежность 🙂

  • 3 авг.716610

    Сеньор бэкендер после 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 — с маленькой — останется доступна только внутри своего пакета, и снаружи её просто не существует. Никаких аннотаций, ключевых слов и конфигураций. Регистр первой буквы — и есть вся система видимости 🙂

  • 20 июл.9241219

    #memes

  • 13 июл.1 133115

    13 июля родился Эрнё Рубик — человек, подаривший миру тот самый кубик. В честь этого сегодня во всем мире отмечают День головоломки. Разгадывание логических задач — это не просто классное хобби. Сегодня это мощный карьерный инструмент. Знаете, что объединяет собеседования в Google, Яндексе и топовых банках? Там обожают проверять кандидатов каверзными логическими задачами. Работодателям важно увидеть, как именно вы мыслите, и умение распутывать такие ребусы на ходу — суперсила, за которую готовы платить. Весь оставшийся месяц будет действовать скидка 10%, поэтому скорее переходите по ссылке, активируйте выгоду и прокачивайте интеллект для будущих карьерных побед!

  • 13 июл.8491211

    #memes

  • 9 июл.802183

    Мы начинаем новую главу курса PRO для продвинутых, и она будет посвящена тому, как писать код, который приятно читать — не только тебе, но и любому, кто откроет его после. 🤓 Будем говорить о том, как сделать код понятным, аккуратным и живым: где стоит упростить, где структурировать, а где просто остановиться и подумать, прежде чем добавить ещё одну строчку. По ходу работы я буду делиться фрагментами и наблюдениями — уверен, многим будет интересно заглянуть в процесс. Спасибо, что вы рядом ❤️

  • 6 июл.1 095129

    #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] И всё — три строчки, а результат честно случайный. Такой же принцип используют и другие языки, просто под капотом. Там тоже идёт тот же самый проход с конца и выбор случайного индекса на каждом шаге — только мы этого не видим, потому что всё спрятано в стандартной функции. Но логика одна и та же: пройтись по массиву, каждый раз менять местами текущий элемент со случайным.

  • 22 июн.1 012116

    #memes

  • 15 июн.1 33768

    #memes

  • 13 июн.1 05996

    🤓Теперь 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), )

  • 8 июн.1 078106

    #memes

  • 🏴‍☠️ Cегодня очередь курса, который любят те, кто хочет прокачать мышление, а не только код. 🧩 PRO Логические задачи — это тренажёр для мозга, который помогает развивать аналитическое мышление, внимательность, умение раскладывать сложные задачи на простые шаги. То, что напрямую влияет на качество кода, скорость решения задач и уверенность на собеседованиях. Внутри курса — десятки логических задач разного уровня: от классических головоломок до задач, которые требуют аккуратного анализа, поиска закономерностей и умения держать в голове несколько условий одновременно. Каждая задача разобрана так, чтобы вы не просто нашли ответ, а поняли ход мысли. Это отличный курс, если вы хотите: -прокачать структурное мышление -научиться видеть решение там, где оно неочевидно -подготовиться к собеседованиям -просто получать удовольствие от задач, которые приятно ломать И сейчас на курс действует скидка по весенней распродаже. А если хотите сделать её ещё больше, просто напишите вашему наставнику. ❤️ Написать наставнику

PRO Go — tgindex