Golang Дайджест
8.35K subscribers
44 photos
2 videos
1 file
197 links
Самое интересное из мира Go: новости, статьи, проекты, сервисы, изменения в языке и др.

Посты публикуются не часто - только самое важное, с чем я лично ознакомился.

Поэтому можно не мьютить канал =)

Обратная связь: @justskiv
Download Telegram
Публичное Code Review

https://youtu.be/oqBTz3E19GA

Недавно в сообществе Gopher Club разгорелась жаркая дискуссия по поводу проекта одного из участников, которая переросла в спонтанный сеанс публичного код ревью от Глеба (одного из участников GoGetPodcast).

В итоге автор проекта получил очень ценный фидбэк, а мы получили крутой контент 💻

#video #codereview
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍92
Options vs Builder Pattern

https://medium.com/@MTrax/golang-options-vs-builder-pattern-4123bfcc3c5c

Автор статьи рассматривает два паттерна для создания сложных объектов с опциональными параметрами - Options Pattern и Builder Pattern, их преимущества, недостатки и примеры реализации.

Options Pattern

Пример использования:

pizza := NewPizza(
WithDough("Regular"),
WithSauce("Tomato"),
WithCheese("Mozzarella"),
WithToppings([]string{"Pepperoni", "Olives", "Mushrooms"}),
)

Плюсы:
- Легкость использования
- Читаемость кода
- Более краткий и компактный код

Минусы:
- Может стать громоздким в использовании
- Меньше гибкость

Builder Pattern

Пример использования:

builder := NewConcretePizzaBuilder()
director := NewDirector(builder)
pizza := director.Construct()

Метод Construct:

func (d *Director) Construct() *Pizza {
return d.builder.
SetDough("Thin Crust").
SetSauce("Tomato").
SetCheese("Mozzarella").
SetToppings([]string{"Mushrooms", "Olives", "Onions"}).
Build()
}

Плюсы:
- Четкое разделение конструкции объекта от его представления
- Гибкость: позволяет создавать разные представления объекта с одним процессом конструкции
- Легко добавлять новые параметры

Минусы:
- Более более сложная и многословная реализация
- Больше абстракций
- Может быть избыточным
————

Как обычно, выбор между Options и Builder зависит от специфических потребностей вашего проекта

#golang #patterns #english
🔥13👍10
💻 С чего начать изучать GoLang? - Ультимативный пост

Оригинальный пост будет обновляться для сохранения актуальности. Репосты при этом не обновляются, поэтому не забывайте проверять оригинал.

Must have, нестареющая классика:

- A Tour of Go - ресурс, с которого 100% надо начинать. Тут вас просто и быстро проведут по всем важным аспектам языка. Прохождение займёт ~4 часа часа, и после этого вы будете знать практически всё, что необходимо
- Effective Go - здесь вас научат не просто писать код, а делать это красиво и эффективно.
- Книга "Язык программирования Go", Донован Алан А. А., Керниган Брайан У - отличная книга, в которой подробно разобрано практически всё, что есть в языке, приведены примеры различных подводных камней и нюансов. Часто в книге объясняется, почему авторы языка сделали именно так, а не иначе. Авторы известные и авторитетные разработчики.

Другие интересные способы начать изучение:

- Go by Example - отличный набор простых и полезных примеров с комментариями
- Learn X in Y minutes – оригинальный и интересный способ изучения языка - вам показывают большой кусок кода с комментариями, который быстро познакомит вас со всеми основами
- Go developer roadmap, о котором я уже писал

Другие ресурсы:

- Николай Тузов - GoLang - YouTube канал с такими же ультимативными уроками по Go ☺️
- Golang Дайджест - ТГ-канал с регулярными подборками материалов по Go
- Go 101 - книга, сосредоточенная на синтаксисе / семантике языка, и на вещах связанных с runtime. Подойдет и новичкам, и опытным разработчикам - для более глубокого понимания.
- How to Write Go Code - пост с рекомендациями по написанию кода от авторов языка
- Go или не Go? от Умпутуна из Radio-T

➡️Но самое главное - не забывайте, что теория это хорошо, но практика важнее. Пишите код, много кода. Только так вы научитесь хорошо писать на Go.

Если вы знаете другие крутые материалы, сервисы и т.п., пишите в комментариях. Самое интересное я буду добавлять в пост.

#golang #guides #подборки
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2713🔥4
Таймауты HTTP Server в Go - как работают и зачем нужны

В стандартной библиотеке Go есть замечательный пакет net/http, в котором есть структура http.Server. Это основная структура для написания сервиса, обрабатывающего HTTP запросы. У http.Server довольно много интересных параметров, но здесь нам интересны таймауты:

- ReadHeaderTimeout - время, отводимое на чтение заголовков запроса
- ReadTimeout - максимальная продолжительность чтения полного запроса, включая тело
- WriteTimeout - максимальное время ожидания до окончания записи ответа
- IdleTimeout - максимальное время ожидания следующего запроса, используется keep-alive

Чтобы лучше уложить в голове, как они используются, давайте вспомним, как сервер работает с входящими запросами:

1. Подключение установлено
|--- ReadHeaderTimeout (если установлен) ---|
2. Заголовки запроса получены
|--- ReadTimeout (если установлен) ---|
3. Тело запроса получено, начинается обработка запроса
4. Обработка завершена, сервер начинает отправлять ответ
|--- WriteTimeout (если установлен) ---|
5. Ответ полностью отправлен клиенту
|--- IdleTimeout (если установлен и соединение остается открытым) ---|
6. Если не было другого запроса в течение IdleTimeout, соединение закрывается
7. Если новый запрос получен до IdleTimeout, процесс начинается сначала с шага 2

Зачем нужно столько таймаутов?

- Борьба с Slowloris атаками: это тип атаки, при которой злоумышленник устанавливает соединение с сервером и отправляет запрос нуу оооочень медленно. Это может приводить к исчерпанию ресурсов сервера и его последующему отказу. Установка ReadHeaderTimeout и ReadTimeout может помочь.
- Отправка больших данных: возможно, клиенты отправляют нам что-то очень большое, и мы не хотим чтобы это заняло слишком много времени. В этом случае помогает ReadTimeout
- Обратная ситуация - работа с ооочень медленными клиентами: Встречаются клиенты со слабым каналом, которые принимают наш ответ очень долго (например, некоторые устройства IoT или просто регионы со слабым интернет-покрытием). В этом случае, если не установить WriteTimeout, сервер может ждать бесконечно долго, пытаясь отправить ответ, что может привести к исчерпанию ресурсов.
- Ограничение использования ресурсов: При большом количестве запросов, особенно в микросервисных архитектурах, установка IdleTimeout помогает освободить ресурсы от долгоживущих соединений, которые больше не используются.

————
☁️ Если я где-то ошибся или был неточен, пожалуйста, напишите об этом в комментах, я всё поправлю

💻 Идея написания этого поста возникла во время записи ролика по REST API, в котором у меня не хватило времени на полноценное объяснение

#гайды #golang #http
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥28👍16
Forwarded from Cross Join - канал о разработке (Anton Okolelov)
Go планирует улучшить производительность в контейнерах (proposal)

GOMAXPROCS - это настройка в Go, которая определяет максимальное количество CPU-ядер, используемых для выполнения горутин параллельно.

В Go 1.25 разработчики предлагают встроить умный GOMAXPROCS, который будет учитывать ограничения контейнера (cgroup).

Сейчас Go автоматически устанавливает GOMAXPROCS равным всем логическим ядрам на машине, что создаёт проблемы в контейнерах, где доступно меньше ресурсов. Это приводит к неэффективной работе, проблемам с производительностью и троттлингу приложения.

Проблема актуальна для всех, кто запускает Go-приложения в контейнерах (Docker, Kubernetes), и остро стоит в окружениях, где на одной машине запускается много контейнеров с ограниченными ресурсами.

Сейчас разработчики решают эту проблему ручной настройкой через переменные окружения или используя библиотеку от убера. Новое предложение добавляет в сам Go автоматическое определение ограничений CPU из cgroups и динамическое обновление GOMAXPROCS при изменении этих ограничений.

🫥 Cross Join

#golang #performance #kubernetes #docker
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥599👍3🤯2
🧙 Тёмные стороны Go — Обсуждаем с разработчиком GoLand

Ну что, 18-й выпуск GoGetPodcast, да? 🙃

Трансляция будет 01.11 (в эту субботу), а через пару дней выйдет запись в хорошем качестве и аудиоверсия, как обычно..

🟢Не забудьте подписаться на новый канал подкаста, ему сейчас очень нужна ваша поддержка.

————

Недавно у нас был выпуск с Арсением, где он рассказал много интересного про разработку GoLand. Получилось очень круто, я даже сам потом пересматривал

Во время разговора выяснилось, что у Арсения есть много вопросов к дизайну Go. Не абстрактных, а самых что ни на есть конкретных — про те места, где разработчики регулярно стреляют себе в ногу спотыкаются: nil-указатели, замыкания в горутинах, слайсы с их коварным append.

Эти темы не вписались в тот выпуск, но они явно заслуживали отдельного разговора, который сулил стать новым крутым выпуском. Особенно если позвать Глеба и Диму — наших постоянных гостей, с которыми мы недавно обсуждали Go v1.25. Мало кто может так же глубоко ответить на такие вопросы.

Да, критики Go хватает, все темы давно изъезжены. Но кто обычно критикует? Сами Go-разработчики которые давно уже привыкли и приняли правила игры? Или разработчики с других платформ, которые Go знают поверхностно?

А вот у Арсения — уникальная позиция. Он опытный инженер, но пишет на Kotlin. При этом работает над IDE для Go, то есть погружён в язык глубже многих гоферов и видит, где они чаще всего наступают на грабли. Ведь его работа — помогать им этого избегать. При этом он сохраняет свежий трезвый взгляд и спрашивает: «А почему вообще так устроено?»

Идеальная комбинация: глубокое знание языка и независимый, непредвзятый взгляд.

Что будем обсуждать:

— Nil safety в Go: почему компилятор не защищает и где это стреляет в проде (кстати, в недавнем выпуске Арсений рассказывал про новую фичу GoLand, которая помогает с этим бороться)
— Слайсы: append выглядит как иммутабельная операция, но мутирует данные
— Замыкания в горутинах: почему они ловят переменные по ссылке и как это приводит к классическим багам
— Shadowing переменных: визуально не отличишь, а линтер не всегда спасает
— Data races при чтении слайсов — да, даже при чтении
— Практические советы: как жить с этим в реальных проектах
И другое

⚠️ Важно:
Это не подкаст про хейт Go и не холивар «Go vs Kotlin».
Это честный технический разговор о трейдофах в дизайне языка — о местах, где Go поможет выстрелить в ногу, и о том, как этого избежать.

Ведь хороший инженер спрашивает не «почему тупые авторы этого не предусмотрели?», он спрашивает «ради чего они решили пойти на эту жертву?».


Состав:

- Николай Тузов
- Арсений Терехов — JetBrains, 👩‍💻 GoLand Team
- Глеб Яльчик
- Дима Матрёничев

💁‍♀️ Во время трансляции можно будет задавать вопросы в чате. Если есть что спросить прямо сейчас — пишите в комментах, мы возьмём самые интересные вопросы в эфир.

————

Предупреждение: после этого разговора ваши код-ревью станут более параноидальными. Но это к лучшему 😩

Заваривайте кофе, будет интересно ☕️

#golang #gogetpodcast
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍52