Библиотека Go-разработчика | Golang
24K subscribers
2.76K photos
53 videos
88 files
5.4K links
Все самое полезное для Go-разработчика в одном канале.

Учиться у нас: clc.to/qaSdww

По рекламе: @proglib_adv

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a4a8c24689c2151c752af0

#WXSSA
Download Telegram
Красивые таблицы в Go

Иногда данные хочется вывести не просто строками в консоль, а в аккуратной читаемой таблице. Чтобы не изобретать велосипеды с fmt.Printf и ручными отступами, можно взять библиотеку tabby.

Что умеет

— Форматировать данные в консольные таблицы.
— Поддерживает выравнивание колонок.
— Позволяет строить вложенные таблицы (nested).

Как использовать:


t := tabby.New()
t.AddHeader("ID", "Name", "Age")
t.AddLine(1, "Alice", 23)
t.AddLine(2, "Bob", 30)
t.Print()


Вывод:


ID Name Age
1 Alice 23
2 Bob 30


📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥17👍5🤔1💯1
🤷‍♂️ Почему Go удобен для AI-кодинга

Команда Go выпустила разбор о том, почему язык хорошо подходит для работы с AI-агентами.

Ключевой аргумент — Go легко проверять:

⬆️gofmt стандартизирует код
⬆️компилятор ловит ошибки
⬆️типов и выдуманные API
⬆️тесты и fuzzing встроены в
⬆️toolchain govulncheck проверяет
⬆️уязвимые зависимости
⬆️go fix и gopls помогают с
⬆️рефакторингом

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

Go + AI — мэтч или удачный маркетинг

🔥Мэтч: агентам нужны строгие рамки
🌚Маркетинг: агент нагенерит приключений на любом языке

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥44🌚174🤔1👾1
Что на самом деле лежит внутри слайса

Слайс — не массив, а небольшая структура:


type slice struct {
array unsafe.Pointer
len int
cap int
}


array указывает на массив с данными, len хранит текущую длину, cap — доступную вместимость. Отсюда две важные особенности.

1️⃣ Срез не копирует данные

s2 := s1[1:3]


s1 и s2 смотрят в один массив. Изменение элемента через s2 может быть видно через s1.

2️⃣ А вот append может разорвать эту связь

Пока хватает cap → запись идёт в существующий массив.
Не хватает cap → выделяется новый backing array, элементы копируются туда.

Поэтому два слайса могут сначала делить память, а после append — уже нет. И наоборот, append без реаллокации способен неожиданно изменить данные, доступные через соседний слайс.

💡 Есть способ контролировать такое поведение через s[low:high:max] — разберём отдельно.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
8🥱6👍3
🔥 Go 1.27 наконец разрешит дженерик-методы

Дженерики появились ещё в Go 1.18, но метод до сих пор не может объявить собственные type parameters.

Поэтому вместо:


func (s Set[T]) Map[U comparable](f func(T) U) Set[U]


приходится писать отдельную generic-функцию:


func MapSet[T, U comparable](s Set[T], f func(T) U) Set[U]


В Go 1.27 это ограничение снимают: собственные type parameters можно будет объявлять прямо у метода.

Но есть граница: generic methods не работают как методы интерфейсов и не могут их реализовывать.

📌 Go 1.27 пока не вышел в stable — изменение уже есть в draft release notes, релиз ожидается в августе.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👏11😢8👍73
⏱️ Go 1.27: ещё одно изменение, которое стоит проверить в старом коде

В прошлом посте разбирали дженерик-методы, которые появятся в Go 1.27. Но в релизе есть и менее заметное изменение — окончательно убирают GODEBUG=asynctimerchan.

Этот переключатель временно возвращал старое поведение time.Timer и time.Ticker из Go 1.22 и более ранних версий.
С Go 1.27 таймерные каналы окончательно становятся синхронными.

Поэтому старый код вроде:


if !t.Stop() {
<-t.C
}
t.Reset(d)


теперь стоит пересмотреть: ручное вычитывание канала перед Reset больше не требуется и может привести к блокировке.

📌 Если уже готовитесь к Go 1.27, проверьте по проекту:

⬆️ asynctimerchan → удалить
⬆️ Stop() + <-t.C → проверить
⬆️ Stop() + Reset() → проверить

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52🥱1
This media is not supported in your browser
VIEW IN TELEGRAM
Вам доклады по Go или Java? VK приглашает на митап с двойной начинкой
26 августа VK собирает Go- и Java-инженеров, чтобы прокачать знания.

В программе два трека — Go и Java, по три доклада в каждом.

Трек Go:
• «Компиляция Go в динамическую либу, или как мы ускорили выкатку фичи в два раза, но нам не понравилось», Михаил Кичигин, бэкенд-разработчик, Avito Tech
• «Go-платформа VK: как мы построили единую основу для создания Go-сервисов», Александр Апанасенко, руководитель команды SDK Backend, VK
• «Почтальон от Kubernetes до Palo Alto. Как осуществляется доставка информации об адресах», Дарья Кулькина, бэкенд-разработчик, Точка Банк

Трек Java:
• «Перформанс-трюки в поисковой платформе Ozon», Пётр Портнов, ведущий разработчик среднего поиска, Ozon
• «Архитектура современного движка платёжной системы и переход к новой архитектуре», Игорь Крикунов, технический лидер разработки DBC, Альфа-Банк
• «Переход от федерации S3-кластеров в пользу коммунального и мультитенантного кластера», Кирилл Боблак, ведущий разработчик One-cloud, VK

А ещё будет мастер-класс по прокачке навыка, который сделает вас звездой любого вечера, и афтепати, чтобы обсудить доклады в неформальной обстановке.

Встречаемся в 17:00, начало в 18:00. Участие бесплатное, регистрация обязательна.
21🔥1🥱1
💡 Что внутри у any

Раньше мы разбирали, что обычный интерфейс это структура из двух указателей, на таблицу типа и на данные. Пустой интерфейс, он же any, устроен похоже, но проще, и об этом стоит знать отдельно.

🟢 Две разные структуры

Непустой интерфейс в рантайме это iface. Внутри у него itab, где лежат тип интерфейса, конкретный тип, хеш и таблица методов. У пустого интерфейса методов нет, значит и таблица методов ему не нужна. Поэтому any представлен другой, более лёгкой структурой, eface.


type eface struct {
_type *_type
data unsafe.Pointer
}


Здесь _type это указатель на описание конкретного типа, а data это указатель на само значение. Никакого itab и списка методов, потому что вызывать через any всё равно нечего. Из-за этого приведение типа и type switch по any сводятся к сравнению указателя на тип, без похода в таблицу методов.

🟢 Классическая ловушка с nil

Из устройства следует известный подвох. Интерфейс равен nil, только когда оба поля пустые, и тип, и данные. Стоит завернуть в интерфейс нетипизированный `nil`-указатель, и получится интерфейс, у которого тип уже не пустой.


var p *MyError = nil
var err error = p
fmt.Println(err == nil) // false


Тип внутри err теперь *MyError, поэтому сравнение с nil даёт false, хотя указатель внутри нулевой. Отсюда практичное правило. Возвращайте из функций именно nil литералом, а не заранее объявленную типизированную переменную, если хотите, чтобы вызывающий код честно увидел nil.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3
⏱️ testing/synctest: тестируем время и горутины без Sleep на секунды

Тесты конкурентного кода часто либо долго выполняются из-за реального времени, либо флакают из-за гонок.
В Go 1.25 появился стабильный testing/synctest, который позволяет запускать тест в изолированном bubble с виртуальным временем.


func TestTimeout(t *testing.T) {
synctest.Test(t, func(t *testing.T) {
ctx, cancel := context.WithTimeout(
context.Background(),
time.Hour,
)
defer cancel()

<-ctx.Done()

if ctx.Err() != context.DeadlineExceeded {
t.Fatal("timeout did not expire")
}
})
}


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

А synctest.Wait() позволяет дождаться, пока конкурентная работа в bubble завершится или перейдёт в состояние ожидания.

📌 synctest был экспериментом в Go 1.24, а с Go 1.25 входит в стандартную библиотеку.

🔗 Источник

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔41
Go-Go-Gadg...Error? Смотрим, как ошибаются Go разработчики!

В Go разработчики ошибаются как и в любом другом языке: опечатки, дубликаты, нерабочие условия проверок и тому подобное.

Но почему? Ведь многие используют тот же go vet который прекрасно находит всё это… ведь так... да?

На вебинаре разработчик PVS-Studio Глеб Асламов разберет частые и типовые ошибки Go разработчиков в известных проектах. А еще вы узнаете, какие ошибки не могут найти стандартные инструменты и подходы (и что с этим делать).

Регистрируйтесь по ссылке! После вебинара все регистранты получат запись.

Подписывайтесь на PVS-Studio, чтобы оставаться в курсе последних новостей о статическом анализе:

— Telegram
— MAX
2
🔎 Go tip: откуда в проекте взялась эта зависимость?

Нашли незнакомый модуль в go.mod и не понимаете, кто его подтянул?

Поможет:


go mod why -m golang.org/x/text


Go покажет цепочку зависимостей, из-за которой модуль оказался нужен проекту.

Например:


your-project

github.com/example/api

golang.org/x/text


📌 Полезно перед чисткой go.mod, обновлением зависимостей или разбором supply chain.

А если нужно посмотреть, какие модули вообще используются, пригодится:


go mod graph


📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4