Иногда данные хочется вывести не просто строками в консоль, а в аккуратной читаемой таблице. Чтобы не изобретать велосипеды с 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
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥17👍5🤔1💯1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁37👍2🤩2
Команда Go выпустила разбор о том, почему язык хорошо подходит для работы с AI-агентами.
Ключевой аргумент — Go легко проверять:
Когда агент пишет код быстрее, чем человек успевает его читать, предсказуемость языка становится отдельным преимуществом.
Go + AI — мэтч или удачный маркетинг
🔥 — Мэтч: агентам нужны строгие рамки
🌚 — Маркетинг: агент нагенерит приключений на любом языке
📍 Навигация: Вакансии • Задачи • Собесы
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥44🌚17❤4🤔1👾1
Слайс — не массив, а небольшая структура:
type slice struct {
array unsafe.Pointer
len int
cap int
}
array указывает на массив с данными, len хранит текущую длину, cap — доступную вместимость. Отсюда две важные особенности.
s2 := s1[1:3]
s1 и s2 смотрят в один массив. Изменение элемента через s2 может быть видно через s1.
Пока хватает cap → запись идёт в существующий массив.
Не хватает cap → выделяется новый backing array, элементы копируются туда.
Поэтому два слайса могут сначала делить память, а после append — уже нет. И наоборот, append без реаллокации способен неожиданно изменить данные, доступные через соседний слайс.
📍 Навигация: Вакансии • Задачи • Собесы
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🥱6👍3
Дженерики появились ещё в 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, релиз ожидается в августе.
📍 Навигация: Вакансии • Задачи • Собесы
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👏11😢8👍7❤3
⏱️ Go 1.27: ещё одно изменение, которое стоит проверить в старом коде
В прошлом посте разбирали дженерик-методы, которые появятся в Go 1.27. Но в релизе есть и менее заметное изменение — окончательно убирают GODEBUG=asynctimerchan.
Этот переключатель временно возвращал старое поведение time.Timer и time.Ticker из Go 1.22 и более ранних версий.
С Go 1.27 таймерные каналы окончательно становятся синхронными.
Поэтому старый код вроде:
теперь стоит пересмотреть: ручное вычитывание канала перед Reset больше не требуется и может привести к блокировке.
📌 Если уже готовитесь к Go 1.27, проверьте по проекту:
⬆️ asynctimerchan → удалить
⬆️ Stop() + <-t.C → проверить
⬆️ Stop() + Reset() → проверить
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoLive
В прошлом посте разбирали дженерик-методы, которые появятся в Go 1.27. Но в релизе есть и менее заметное изменение — окончательно убирают GODEBUG=asynctimerchan.
Этот переключатель временно возвращал старое поведение time.Timer и time.Ticker из Go 1.22 и более ранних версий.
С Go 1.27 таймерные каналы окончательно становятся синхронными.
Поэтому старый код вроде:
if !t.Stop() {
<-t.C
}
t.Reset(d)
теперь стоит пересмотреть: ручное вычитывание канала перед Reset больше не требуется и может привести к блокировке.
📍 Навигация: Вакансии • Задачи • Собесы
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2🥱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. Участие бесплатное, регистрация обязательна.
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. Участие бесплатное, регистрация обязательна.
❤2⚡1🔥1🥱1
Раньше мы разбирали, что обычный интерфейс это структура из двух указателей, на таблицу типа и на данные. Пустой интерфейс, он же
any, устроен похоже, но проще, и об этом стоит знать отдельно.Непустой интерфейс в рантайме это
iface. Внутри у него itab, где лежат тип интерфейса, конкретный тип, хеш и таблица методов. У пустого интерфейса методов нет, значит и таблица методов ему не нужна. Поэтому any представлен другой, более лёгкой структурой, eface.
type eface struct {
_type *_type
data unsafe.Pointer
}
Здесь
_type это указатель на описание конкретного типа, а data это указатель на само значение. Никакого itab и списка методов, потому что вызывать через any всё равно нечего. Из-за этого приведение типа и type switch по any сводятся к сравнению указателя на тип, без похода в таблицу методов.Из устройства следует известный подвох. Интерфейс равен
nil, только когда оба поля пустые, и тип, и данные. Стоит завернуть в интерфейс нетипизированный `nil`-указатель, и получится интерфейс, у которого тип уже не пустой.
var p *MyError = nil
var err error = p
fmt.Println(err == nil) // false
Тип внутри
err теперь *MyError, поэтому сравнение с nil даёт false, хотя указатель внутри нулевой. Отсюда практичное правило. Возвращайте из функций именно nil литералом, а не заранее объявленную типизированную переменную, если хотите, чтобы вызывающий код честно увидел nil.📍 Навигация: Вакансии • Задачи • Собесы
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3
Тесты конкурентного кода часто либо долго выполняются из-за реального времени, либо флакают из-за гонок.
В 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 входит в стандартную библиотеку.
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔4❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13👏3❤2
Go-Go-Gadg...Error? Смотрим, как ошибаются Go разработчики!
В Go разработчики ошибаются как и в любом другом языке: опечатки, дубликаты, нерабочие условия проверок и тому подобное.
Но почему? Ведь многие используют тот же go vet который прекрасно находит всё это… ведь так... да?
На вебинаре разработчик PVS-Studio Глеб Асламов разберет частые и типовые ошибки Go разработчиков в известных проектах. А еще вы узнаете, какие ошибки не могут найти стандартные инструменты и подходы (и что с этим делать).
Регистрируйтесь по ссылке! После вебинара все регистранты получат запись.
Подписывайтесь на PVS-Studio, чтобы оставаться в курсе последних новостей о статическом анализе:
— Telegram
— MAX
В Go разработчики ошибаются как и в любом другом языке: опечатки, дубликаты, нерабочие условия проверок и тому подобное.
Но почему? Ведь многие используют тот же go vet который прекрасно находит всё это… ведь так... да?
На вебинаре разработчик PVS-Studio Глеб Асламов разберет частые и типовые ошибки Go разработчиков в известных проектах. А еще вы узнаете, какие ошибки не могут найти стандартные инструменты и подходы (и что с этим делать).
Регистрируйтесь по ссылке! После вебинара все регистранты получат запись.
Подписывайтесь на PVS-Studio, чтобы оставаться в курсе последних новостей о статическом анализе:
— Telegram
— MAX
❤2
Нашли незнакомый модуль в 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
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4