7530
По всем вопросам- @haarrp @itchannels_telegram - 🔥полезные ит-каналы https://t.me/Golang_google - Golang программирование @golangl - golang chat @GolangJobsit - golang channel jobs @golang_jobsgo - go chat jobs
Nil-интерфейс в Go: почему err == nil выдаёт false?
Nil-интерфейс в Go ломает даже опытных разработчиков: функция возвращает nil-указатель *E, а проверка err == nil всё равно даёт false. Причина в том, что интерфейс хранит пару из типа и значения, и пока тип *E на месте, интерфейс не считается пустым. Хочешь вернуть «нет ошибки», возвращай nil явно.
youtube.com/shorts/6LK-o-BSjHA?feature=share
Не застревайте в прошлом — учитесь новым навыкам и ИИ
Чтобы успевать за требованиями рынка, освойте новую профессию и нейросети в Практикуме. До 30 сентября действует скидка 16% на все курсы.
Выбрать курс
Как всё устроено:
— нейросети уже в каждом курсе: учим профессиям сразу с ИИ, чтобы ваше резюме было заметнее, а трудоустройство — увереннее;
— эксперты — практики, которые двигают ИИ-индустрию: перенимайте опыт у профи из Яндекса, Сбера, Т-Банка и других бигтех-компаний;
— воркшопы, которые успевают за изменениями: если сегодня завирусится новая нейросеть, то завтра вы сможете обсудить её с наставником.
Начните учиться бесплатно и получите скидку 16% — она автоматически появится в личном кабинете.
Учиться!
Erid: 2SDnjeMs7zT
Название: ООО "ЯНДЕКС"
ИНН: 7736207543
🔥 Хочешь расти в IT быстрее остальных? Перестань учиться в одиночку
Можно годами смотреть курсы, читать документацию и всё равно топтаться на месте.
А можно попасть в правильное окружение, где каждый день обсуждают новые инструменты, вакансии, реальные кейсы, ошибки и то, что уже завтра станет стандартом.
Здесь собраны папки и каналы по разным направлениям IT, чтобы ты быстрее находил нужных людей, идеи и полезный контент - без бесконечного поиска.
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
DevOps: t.me/DevOPSitsec
Docker: /channel/+90Z5TAyfuNU5YmRi
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_ci
Java: t.me/javatg
JavaScript: t.me/javascriptv
React: t.me/react_tg
Frontend: t.me/front
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Data Science: t.me/data_analysis_ml
Big Data: t.me/bigdatai
Математика: t.me/data_math
Физика: t.me/fizmat
Kubernetes: t.me/kubernetc
GameDev: /channel/gamedev
Haskell: t.me/haskell_tg
Собеседования и карьера:
DS собеседования: t.me/machinelearning_interview
Python собеседования: t.me/python_job_interview
Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: /channel/addlist/2Ls-snqEeytkMDgy
Папка Frontend: /channel/addlist/mzMMG3RPZhY2M2Iy
Полезное сверху:
ИТ-мемы: t.me/memes_prog
Английский для программистов: t.me/english_forprogrammers
ИИ и технологии: t.me/vistehno
954 ГБ open-source курсов: /channel/+rKBQEMccAA01MTcy
ИТ-книги бесплатно: /channel/addlist/BkskQciUW_FhNjEy
Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg
Подпишись и сохрани, здесь регулярно появляются новые подборки, инструменты и материалы, которые реально помогают расти быстрее.
Go-задача: что выведет этот код?
package main
import "fmt"
func main() {
var funcs []func()
for i := range 3 {
funcs = append(funcs, func() {
fmt.Println(i)
})
}
for _, f := range funcs {
f()
}
}
A)
0
0
0
😎
2
2
2
C)
0
1
2
Лето, ИТ-Пикник и музыка известных артистов уже через несколько дней!
8 августа в Коломенском пройдет ИТ-Пикник.
В программе — выступления проекта LAB Антона Беляева, IOWA, Cream Soda, Pompeya, мартина и Совы.
А днем — научпоп-лекции, дискуссии об ИИ и больших языковых моделях, мастер-классы и интерактивы. Полезные знакомства и развлечения тоже будут.
Зарегистрироваться и узнать подробности можно на сайте мероприятия.
В билет входит +1 — можно позвать близких и друзей.
До встречи в месте притяжения ИТ.
Каждый год в середине лета мы с друзьями собираемся на E-CODE. Ещё относительно молодая конфа Ozon Tech стала уже своего рода легендой. Не удивительно: хардовость официальной части здесь не уступает громкости афтерпати.
На E-CODE 2026 нас по части бэкэнда ждут:
• Runtime Async с его + и –
• трассировка с eBPF
• ускорение на SIMD
• построение кастомной real-time системы видеоаналитики
• сравнительный анализ алгоритмов сборки мусора
Фишка этого года — брейнринг разработчиков и ИИ. Эксперты разберут сложные кейсы и сравнят свои подходы с тем, что предложит машина. Победителя выберет зал.
Регистрируйтесь сейчас, чтобы услышать это всё вживую: https://ecode.ozon.tech/
12 и 13 сентября, Москва. До встречи на E-CODE!
🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку
В IT прокачивается тот, кто каждый день видит сильные идеи, новые инструменты, реальные задачи, вакансии и разборы.
Окружение решает больше, чем кажется.
Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
DevOps: t.me/DevOPSitsec
Docker: t.me/DevopsDocker
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_1001_notes
Java: t.me/java_library
JavaScript: t.me/javascriptv
React: t.me/react_tg
Frontend: t.me/front
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Data Science: t.me/data_analysis_ml
Big Data: t.me/bigdatai
Математика: t.me/data_math
Физика: t.me/fizmat
Kubernetes: t.me/kubernetc
GameDev: /channel/gamedev
Haskell: t.me/haskell_tg
Собеседования и карьера:
DS собеседования: t.me/machinelearning_interview
Python собеседования: t.me/python_job_interview
Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: /channel/addlist/2Ls-snqEeytkMDgy
Папка Frontend: /channel/addlist/mzMMG3RPZhY2M2Iy
Полезное сверху:
ИТ-мемы: t.me/memes_prog
Английский для программистов: t.me/english_forprogrammers
ИИ и технологии: t.me/vistehno
954 ГБ open-source курсов: @courses
ИТ-книги бесплатно: /channel/addlist/BkskQciUW_FhNjEy
Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
Пока кто-то листает шум, ты будешь видеть инструменты, задачи и идеи, которые помогают расти в профессии.
👣 Golang-задача с подвохом
Версия: Go 1.23+
Что выведет код?
package main
import "fmt"
func numbers(yield func(int) bool) {
defer fmt.Println("iterator: defer")
for i := 0; i < 5; i++ {
if !yield(i) {
fmt.Println("iterator: stopped")
return
}
fmt.Println("iterator: after yield", i)
}
}
func main() {
for n := range numbers {
fmt.Println("main:", n)
if n == 2 {
break
}
}
fmt.Println("main: done")
}
break итератор просто мгновенно исчезнет.range по функции.yield возвращает false, если внешний цикл остановился через break.
⚡️ Вышло большое обновление популярного курса- Ai AI агенты, которые реально работают в проде!
Вы всё ещё пишете обёртки над ChatGPT и называете это «AI-продуктом»?
Пока вы промптите - рынок переходит на агентные системы. Те, что принимают решения, ходят в API, работают с Postgres и Redis, управляют браузером через Playwright.
И 90% таких систем ломаются между ноутбуком и продом.
AI Agents Engineering - курс, который закрывает этот разрыв. LangGraph, AutoGen, Computer Use, LLMOps. 8 модулей, 120+ шагов - от архитектуры до деплоя в Docker.
На выходе: реальный опыт на большой практической базе, а production-агент и навыки, за которые уже платят.
👉 48 часов действует скидка на курс 55 процентов: https://stepik.org/a/276971/
Проект можно запустить быстро, но выдержит ли он рост нагрузки, требования к безопасности и отказоустойчивости? Часто на старте думают только о функциях. Производительность, масштабирование, защита — добавим потом. В реальности это «потом» оборачивается дорогими переделками и компромиссами.
На бесплатном вебинаре:
• разберём, как требования к нагрузке, отказоустойчивости и безопасности формируют архитектуру с первого дня.
• поговорим о том, какие нефункциональные требования влияют на систему сильнее всего.
• как собирать и формулировать их вместе с бизнесом и как принимать архитектурные решения с учётом сроков и бюджета.
Спикер Александр Хохлов — архитектор платформенных решений в ГК Иннотех.
Открытый урок проходит в преддверии старта курса «Проектирование систем».
Регистрируйтесь сейчас - напомним перед вебинаром: регистрация
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
❓ Почему код падает и как это исправить
Функция должна заполнить срез и мапу,
но сейчас она падает с panic.
В чём проблема?
func fillData(s []int, m map[string]int) {
// Добавляем в срез
s = append(s, 10, 20, 30)
// Добавляем в мапу
m["count"] = len(s)
m["total"] = 60
fmt.Println("Срез:", s)
fmt.Println("Мапа:", m)
}
func main() {
fillData(nil, nil)
}
Хитрая Go-задача:
package main
import "fmt"
type uint128 struct {
Hi uint64
Lo uint64
}
func f(φ uint128, β int) uint32 {
return uint32(φ.Hi >> (63 - β))
}
func main() {
x := uint128{Hi: 0x8000000000000001}
fmt.Println(f(x, 0))
fmt.Println(f(x, 1))
fmt.Println(f(x, 63))
}
👣 Большинство изучают Go ради синтаксиса.
Ты научишься писать сервисы, которые работают в продакшене.
Это не про «Hello, World» и горутины ради галочки.
Это про бэкенд на Go, который:
* выдерживает нагрузку
* обрабатывает тысячи запросов одновременно
* работает быстро и стабильно
* легко масштабируется
* выглядит как реальный сервис, а не учебный проект
Ты начнёшь видеть Go не как язык, а как инструмент для построения систем.
В итоге ты сможешь:
* писать высоконагруженные API
* создавать микросервисы
* работать с базами данных и очередями
* разбираться в конкурентности и производительности
* брать коммерческие backend-проекты
Это навык, который ценится на рынке.
Не «знаю Go», а умею делать быстрые и надёжные сервисы.
🎁 48 часов скидка 50% на Stepik: https://stepik.org/a/274119/
🔥 PrimeView - реальная производительность языков без маркетинга
https://plummerssoftwarellc.github.io/PrimeView/report
PrimeView - это живой бенчмарк, который сравнивает языки программирования на одной задаче: генерация простых чисел.
Без синтетических тестов.
Без “идеальных условий”.
Только:
* один алгоритм
* одинаковые правила
* реальные оптимизации от разработчиков
Что показывают результаты:
* C и C++ стабильно в лидерах
* Rust и Zig уверенно конкурируют с нативным кодом
* Go показывает сильные результаты при грамотной оптимизации
* разница между реализациями внутри одного языка часто больше, чем между языками
Ключевой инсайт:
Производительность определяет не язык.
Производительность определяет инженер.
SIMD, работа с памятью, кэш-локальность и битовые оптимизации дают больший эффект, чем выбор технологии.
plummerssoftwarellc.github.io/PrimeView/report
Это один из самых любимых вопросов на Go-собеседованиях.
Проверяют, понимаешь ли ты, как устроены slice, len / cap и что реально делает append.
Что выведет программа?
package main
import "fmt"
func add(s []int) {
s = append(s, 99)
}
func main() {
a := make([]int, 2, 4)
a[0], a[1] = 1, 2
add(a)
fmt.Println("a:", a)
fmt.Println("a[:3]:", a[:3])
}
import "fmt"
func add(s []int) {
s = append(s, 99)
s[0] = 42
}
func main() {
a := []int{1, 2}
add(a)
fmt.Println("a:", a)
}
Задача по Go: `select` и побочные эффекты
Что выведет программа?
package main
import "fmt"
func value() int {
fmt.Print("A")
return 42
}
func main() {
var ch chan int
select {
case ch <- value():
fmt.Print("B")
default:
fmt.Print("C")
}
}
CACABch равен nil, поэтому отправка никогда не может выполниться и select выбирает default.value() всё равно вызывается и печатает A. Затем выполняется default, который печатает C.
👣 Задача на Go 1.27: concurrent job scheduler с generic methods
Нужно реализовать библиотеку scheduler, которая запускает задачи параллельно, ограничивает concurrency, поддерживает context.Context, retry, timeout и возвращает типизированные результаты.
💡 Требования
Создайте generic-тип:
type Scheduler[T any] struct {
// ...
}
Он должен поддерживать регистрацию задач:
type Job[T any] func(ctx context.Context) (T, error)
И новый generic method Go 1.27:
func (s *Scheduler[T]) Map[R any](
ctx context.Context,
fn func(context.Context, T) (R, error),
) ([]R, error)
Функциональность
Scheduler должен уметь:
выполнять не более N задач одновременно;
отменять все оставшиеся задачи при отмене context.Context;
задавать timeout для каждой задачи;
делать до K retry с exponential backoff;
сохранять исходный порядок результатов;
не иметь data race;
корректно завершать goroutines без утечек;
возвращать ошибку с информацией, какая задача упала.
Пример API:
```go
s := scheduler.New[int](
scheduler.WithWorkers(8),
scheduler.WithRetries(3),
scheduler.WithTimeout(2*time.Second),
)
for i := range 100 {
n := i
s.Add(func(ctx context.Context) (int, error) {
return expensiveOperation(ctx, n)
})
}
values, err := s.Run(ctx)
strings, err := s.Map(ctx, func(
ctx context.Context,
value int,
) (string, error) {
return strconv.Itoa(value), nil
})
go test ./...
go test -race ./...
go vet ./...
Дополнительный уровень
func (s *Scheduler[T]) Stream(
ctx context.Context,
) <-chan Result[T]
priority queue;
dynamic worker count;
graceful shutdown;
metrics через expvar;
retry только для определённых типов ошибок;
panic recovery внутри job;
benchmark;
fuzz tests.
👣 Go 1.27: почему две разные closure внезапно могут иметь одинаковый адрес функции?
Что выведет этот код и почему на Go 1.27 поведение стало особенно интересным?
package main
import (
"fmt"
"reflect"
)
func makeFn(x int) func() int {
return func() int {
return x
}
}
func main() {
a := makeFn(10)
b := makeFn(20)
pa := reflect.ValueOf(a).Pointer()
pb := reflect.ValueOf(b).Pointer()
fmt.Println(a(), b())
fmt.Println(pa == pb)
}
Задача Go 1.26, на которой легко ошибиться даже опытному разработчику
Что выведет этот код?
package main
import "fmt"
type Config struct {
Timeout *int
}
func main() {
a := Config{
Timeout: new(30),
}
b := a
*b.Timeout = 60
c := Config{
Timeout: new(*a.Timeout),
}
*c.Timeout = 90
fmt.Println(
*a.Timeout,
*b.Timeout,
*c.Timeout,
)
}
🧠 Редкая задача для Go-разработчиков
Версия: Go 1.23+
Именно в Go 1.23 появился range по функциям-итераторам и пакет iter.
Нужно реализовать:
func MergeSorted(a, b iter.Seq[int]) iter.Seq[int]
a := Seq(1, 4, 7, 10)
b := Seq(2, 3, 8, 9)
for v := range MergeSorted(a, b) {
fmt.Println(v)
}
1 2 3 4 7 8 9 10
[]int;break, оба исходных итератора должны прекратить работу;
func MergeSorted[T cmp.Ordered](
a, b iter.Seq[T],
) iter.Seq[T]
В Go 1.26 появился типобезопасный errors.AsType, который ищет ошибку нужного типа внутри дерева обёрток.
package main
import (
"errors"
"fmt"
)
type CodeError struct {
Code int
}
func (e *CodeError) Error() string {
return fmt.Sprintf("code=%d", e.Code)
}
type MaskError struct {
Value int
}
func (e MaskError) Error() string {
return "masked"
}
func (e MaskError) As(target any) bool {
dst, ok := target.(**CodeError)
if !ok {
return false
}
*dst = &CodeError{Code: e.Value}
return true
}
func main() {
err := errors.Join(
fmt.Errorf("left: %w", MaskError{Value: 10}),
errors.Join(
&CodeError{Code: 20},
fmt.Errorf("right: %w", &CodeError{Code: 30}),
),
)
result, ok := errors.AsType[*CodeError](err)
fmt.Println(ok, result.Code)
}
👣 Go давно починил старую ловушку с замыканиями в цикле.
Но concurrency всё ещё может кусаться.
Что не так с этим кодом?
package main
import (
"fmt"
"sync"
)
func main() {
nums := []int{1, 2, 3, 4}
var wg sync.WaitGroup
result := make([]int, 0, len(nums))
for i, n := range nums {
wg.Go(func() {
result = append(result, i*n)
})
}
wg.Wait()
fmt.Println(result)
}
i и n уже не общие для всех итераций. В современном Go каждая итерация получает свои переменные, поэтому старого бага с замыканием тут нет.
Собираетесь к нам в Go?
➡ Рассказали, как мы построили наймовый процесс, чтобы сделать его честнее для всех.
Другие инженерные инсайты от 2ГИС → в Telegram-канале RnD
Для тех, кто строит и масштабирует сервисы на Go: 25 апреля пройдет Я.Субботник по Go
Яндекс проведет митап офлайн в Санкт-Петербурге и онлайн. Участников будут ждать практические доклады, живые кейсы и решения, проверенные под нагрузкой.
Руководитель группы разработки Городских сервисов Владимир Тельбухов покажет, как наладить консистентность в интеграциях с внешними сервисами. А разработчик Yandex Cloud Иван Похабов, расскажет, как устроен GoBGP, какие баги в нём встречаются и как их исправляют в production. Полную программу выступлений можно найти на сайте.
Помимо докладов, для участников проведут круглые столы, квиз по Go, а также экскурсию по питерскому офису Яндекса, для которой офлайн-участникам потребуется предварительная регистрация.
👉 Регистрируемся
🔍Тестовое собеседование с Go Senior из Uzum в этот четверг
9 апреля(в четверг!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Go-разработчика.
Как это будет:
📂 Маруф Караев, Senior из Uzum, ex-Яндекс, ex-EPAM будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Маруф будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Маруфу
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Go-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_go_bot
Реклама.
О рекламодателе.
Скоро стартует F1 для Go-инженеров — VK JT Meetup
VK приглашает обсудить реальные архитектурные кейсы, а также новости и вызовы индустрии.
Когда и где:
📍 Москва — 4 апреля
📍 Санкт-Петербург — 11 апреля
Только офлайн. В программе технические доклады, командные активности и общение.
Москва:
• как сократить число проверок прав с 400 млн до 200 тысяч, не сломав бизнес-логику
• устройство безопасной архитектуры платформы мини-приложений: изоляция, мультитенантность, контроль ресурсов и границы ответственности между платформой и разработчиком
Дальше два трека на выбор: решение архитектурной задачи в команде с обратной связью от лидов VK или обсуждение инженерных новостей в записи подкаста. А в завершение встречи — неформальная вечеринка с коллегами.
Санкт-Петербург:
• устройство безопасной архитектуры платформы мини-приложений: изоляция, мультитенантность, контроль ресурсов и границы ответственности между платформой и разработчиком
• как сделать клиент для Tarantool на Go по-настоящему быстрым — от наивной реализации до оптимизаций, которые режут аллокации и горутины
После докладов — решение архитектурной задачи и живое общение с экспертами VK и коллегами.
Участие бесплатное. Регистрируйтесь по ссылке и приходите!
👣 Задача: что выведет программа?
package main
import "fmt"
func main() {
for i := 0; i < 3; i++ {
defer fmt.Println(i)
}
for i := 0; i < 3; i++ {
defer func() {
fmt.Println(i)
}()
}
for i := 0; i < 3; i++ {
i := i
defer func() {
fmt.Println(i)
}()
}
}
🧠 Хитрая Go-задача про интерфейсы и память (x64)
Код:
package main
import (
"fmt"
"unsafe"
)
type Foo struct {
A int64
}
type IFoo interface {
Get() int64
}
func (f Foo) Get() int64 { return f.A }
func main() {
var a int64 = 10
var s Foo = Foo{A: 42}
var i IFoo = s
fmt.Println(unsafe.Sizeof(a))
fmt.Println(unsafe.Sizeof(s))
fmt.Println(unsafe.Sizeof(i))
}
В Go nil - это не просто «пусто».
Иногда это причина самых странных багов в продакшене.
nil в Go - это не одно значение, а множество разных nil.
1. Interface и nil — ловушка
var err error = nil
fmt.Println(err == nil) // true
var e *MyError = nil
var err error = e
fmt.Println(err == nil) // false (!)
2. Typed nil vs untyped nil
var p *int = nil
var s []int = nil
var m map[string]int = nil
3. Panic из-за nil внутри interface
type User struct{}
func (u *User) Name() string {
return "John"
}
var u *User = nil
var i interface{} = u
i.(*User).Name() // panic
func do() error {
var e *MyError = nil
return e
}
func do() error {
if somethingWrong {
return &MyError{}
}
return nil
}
interface != nil, если внутри typed nil
👣 Понимание выравнивания памяти в Go
В Go важно понимать, как компилятор размещает данные в памяти - это напрямую влияет на скорость работы и объём используемой памяти.
Что такое выравнивание?
Выравнивание памяти - это правило: данные должны находиться по адресам, кратным их размеру. Это нужно, чтобы процессор мог читать и записывать значения за одну операцию.
Например:
- int64 требует выравнивания по 8 байтам
- int32 - по 4 байтам
- byte - по 1 байту
Если значение лежит “неудобно”, CPU делает несколько операций вместо одной - это медленнее.
Почему появляется padding
Компилятор Go автоматически вставляет пустые байты (padding) между полями структуры, чтобы соблюсти правила выравнивания.
Размер структуры - это не просто сумма размеров полей.
Пример:
type Example struct {
a byte // 1 байт
b int64 // 8 байт (нужно выравнивание по 8)
c byte // 1 байт
}
type Optimized struct {
b int64
a byte
c byte
}