Golang Дайджест
7.65K subscribers
34 photos
1 file
161 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
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
💻 С чего начать изучать 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
Таймауты 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
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