🔎 Задача на Go с подвохом
Код:
Вопрос: Что выведет этот код?
Варианты ответа:
A.
B.
C.
D.
Правильный ответ:B
Объяснение:
1. Создается срез с длиной 3 и capacity 4, заполненный значениями [1, 2, 3]
2. При передаче в функцию modifySlice:
— append добавляет элемент 4, но не вызывает переаллокацию
— Изменение s[0] = 100 применяется к тому же underlying массиву
3. Однако исходный срез в main() останется длины 3, но первый элемент изменится:
— Длина среза в main не меняется
— Но изменения элементов видны, так как используется тот же массив
@golang_interview
Код:
package main
import "fmt"
func main() {
s := make([]int, 3, 4) // Длина 3, capacity 4
s[0], s[1], s[2] = 1, 2, 3
modifySlice(s)
fmt.Println(s)
}
func modifySlice(s []int) {
s = append(s, 4)
s[0] = 100
}
Вопрос: Что выведет этот код?
Варианты ответа:
A.
[1 2 3]
B.
[100 2 3]
C.
[1 2 3 4]
D.
[100 2 3 4]
Правильный ответ:
Объяснение:
1. Создается срез с длиной 3 и capacity 4, заполненный значениями [1, 2, 3]
2. При передаче в функцию modifySlice:
— append добавляет элемент 4, но не вызывает переаллокацию
— Изменение s[0] = 100 применяется к тому же underlying массиву
3. Однако исходный срез в main() останется длины 3, но первый элемент изменится:
— Длина среза в main не меняется
— Но изменения элементов видны, так как используется тот же массив
@golang_interview
🔥31👍7❤4😁2🥱1
Встраивайте файлы прямо в Go-код с помощью пакета embed и директивы
//go:embed
. Это работает как для отдельных файлов, так и для целых директорий:
import _ "embed"
//go:embed config.json
var config []byte
//go:embed version.txt
var version string
//go:embed templates/*
var templates embed.FS
📌 Удобно для:
- конфигов
- файлов с версией
- HTML-шаблонов
- любых статических ресурсов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32❤11🔥7
📊 SlimToolkit — инструмент для оптимизации Docker-образов
Проект из песочницы CNCF помогает уменьшать размер контейнеров до 30 раз без изменения исходного кода. Он анализирует приложение внутри контейнера, определяет необходимые зависимости и создает минималистичный образ.
Инструмент помимо уменьшения размера, автоматически генерирует Seccomp и AppArmor профили для повышения безопасности. Поддерживает образы на Node.js, Python, Ruby, Java, Go и других стеках.
🤖 GitHub
@golang_interview
Проект из песочницы CNCF помогает уменьшать размер контейнеров до 30 раз без изменения исходного кода. Он анализирует приложение внутри контейнера, определяет необходимые зависимости и создает минималистичный образ.
Инструмент помимо уменьшения размера, автоматически генерирует Seccomp и AppArmor профили для повышения безопасности. Поддерживает образы на Node.js, Python, Ruby, Java, Go и других стеках.
🤖 GitHub
@golang_interview
👍5❤4🔥4
🧪 Миф о стеке и куче в Go
Из-за этой схемы существует ошибочное представление о том, что переменные стека имеют более высокие адреса, чем переменные кучи. В Go это неверно.
Во первых: эта диаграмма появилась в эпоху, когда процесс имел ровно один поток.
Во вторых: на схеме показывается стек потоков, а не стек горутин.
Стек горутин выделяется средой выполнения из памяти, управляемой кучей, поэтому он может находиться как выше, так и ниже адресов переменных кучи. Более того, стек горутин способен динамически перемещаться и увеличиваться по мере роста программы, что полностью разрушает иллюзию фиксированного расположения
Из-за этой схемы существует ошибочное представление о том, что переменные стека имеют более высокие адреса, чем переменные кучи. В Go это неверно.
Во первых: эта диаграмма появилась в эпоху, когда процесс имел ровно один поток.
Во вторых: на схеме показывается стек потоков, а не стек горутин.
Стек горутин выделяется средой выполнения из памяти, управляемой кучей, поэтому он может находиться как выше, так и ниже адресов переменных кучи. Более того, стек горутин способен динамически перемещаться и увеличиваться по мере роста программы, что полностью разрушает иллюзию фиксированного расположения
👍16❤2🔥2
🚀 Zig показывает мощь метапрограммирования на компайм-тайме
Смотрите, как можно вызвать разные методы у разных структур, используя одно универсальное определение функции:
Смотрите, как можно вызвать разные методы у разных структур, используя одно универсальное определение функции:
const std = @import("std");
const T = struct {
fn name() []const u8 {
return "foo";
}
fn foo() void {
std.debug.print("T.foo\n", .{});
}
};
const S = struct {
fn name() []const u8 {
return "bar";
}
fn bar() void {
std.debug.print("S.bar\n", .{});
}
};
fn f(Type: type) void {
@field(Type, Type.name())();
}
pub fn main() !void {
f(T); // <=> T.foo()
f(S); // <=> S.bar()
}
❤8❤🔥4🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍7🔥4
Forwarded from Golang
В релизе Go 1.25 представлена важная улучшенная логика работы
GOMAXPROCS
в контейнеризованных средах — например, в Kubernetes.Как это работает:
- Раньше по умолчанию
GOMAXPROCS
устанавливался равным числу логических CPU на хосте. - Теперь на Linux runtime автоматически учитывает CPU limits, заданные для контейнера. Если лимит меньше числа логических ядер —
GOMAXPROCS
устаналивается на уровне лимита. - Более того, runtime периодически обновляет
GOMAXPROCS
, если меняются доступные CPU или ограничения, без необходимости внешнего вмешательства. Почему это важно:
Ранее разработчикам приходилось использовать внешние решения вроде
uber-go/automaxprocs
, чтобы вручную синхронизировать GOMAXPROCS
с лимитами контейнера. Теперь runtime делает это автоматически и точнее: - Внутри контейнера Go не будет пытаться использовать все ядра хоста
- Уменьшаются лишние горутины, контекстные переключения и нагрузка на GC
Кратко: начиная с Go 1.25,
GOMAXPROCS
адаптируется под реальные CPU-ресурсы контейнера — без дополнительных усилий.📌 Подробности
@golang_google
#golang #Kubernetes
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12❤7
🛡️ JWT для Go: безопасная работа с JSON Web Tokens
Библиотека для работы с JSON Web Tokens (JWT) на Go, поддерживающая создание, верификацию и парсинг токенов. Обеспечивает безопасность и совместимость с предыдущими версиями, включая поддержку различных алгоритмов подписи.
🚀 Основные моменты:
- Поддержка HMAC, RSA, RSA-PSS и ECDSA.
- Совместимость с RFC 7519.
- Легкость в добавлении собственных методов подписи.
- Активная поддержка и обновления.
📌 GitHub
#go
Библиотека для работы с JSON Web Tokens (JWT) на Go, поддерживающая создание, верификацию и парсинг токенов. Обеспечивает безопасность и совместимость с предыдущими версиями, включая поддержку различных алгоритмов подписи.
🚀 Основные моменты:
- Поддержка HMAC, RSA, RSA-PSS и ECDSA.
- Совместимость с RFC 7519.
- Легкость в добавлении собственных методов подписи.
- Активная поддержка и обновления.
📌 GitHub
#go
👍6🔥2❤1
Forwarded from Golang
This media is not supported in your browser
VIEW IN TELEGRAM
🚀 LeetSolv — инструмент для тренировки алгоритмов прямо в терминале
LeetSolv — это консольная утилита, написанная нп Go для подготовки к собеседованиям по алгоритмам и структурам данных.
Инструмент помогает повторять задачи по умному расписанию (алгоритм SM-2) и не забывать то, что уже решал.
⚡ Что умеет:
- Лёгкий CLI без лишних зависимостей (написан на Go).
- Планирует повторения задач с учётом:
- насколько хорошо ты знаешь задачу,
- насколько она важна,
- насколько сложно её понять.
- Автоматически выставляет приоритеты: что решать сначала, что можно отложить.
- Полный набор команд: добавить, удалить, редактировать задачи, откатить изменения.
- Все данные хранятся только у тебя локально.
- Два режима работы:
- интерактивный (вопрос-ответ в терминале),
- командный (`add`,
📦 Установка:
📌 Github: https://github.com/eannchen/leetsolv
LeetSolv — это консольная утилита, написанная нп Go для подготовки к собеседованиям по алгоритмам и структурам данных.
Инструмент помогает повторять задачи по умному расписанию (алгоритм SM-2) и не забывать то, что уже решал.
⚡ Что умеет:
- Лёгкий CLI без лишних зависимостей (написан на Go).
- Планирует повторения задач с учётом:
- насколько хорошо ты знаешь задачу,
- насколько она важна,
- насколько сложно её понять.
- Автоматически выставляет приоритеты: что решать сначала, что можно отложить.
- Полный набор команд: добавить, удалить, редактировать задачи, откатить изменения.
- Все данные хранятся только у тебя локально.
- Два режима работы:
- интерактивный (вопрос-ответ в терминале),
- командный (`add`,
list
, search
и т.п.). 📦 Установка:
curl -fsSL https://raw.githubusercontent.com/eannchen/leetsolv/main/install.sh | bash
📌 Github: https://github.com/eannchen/leetsolv
🔥12❤7👍3🤔1
🛠 Go совет: как правильно использовать sync.WaitGroup
Частая ошибка — вызывать
Такой код может не сработать правильно: горутина может стартовать позже, чем основной поток дойдёт до
⚡ Чем нам поможет новая версия Go 1.25:
-
- Появился удобный метод
Пример:
Частая ошибка — вызывать
wg.Add()
внутри горутины. Такой код может не сработать правильно: горутина может стартовать позже, чем основной поток дойдёт до
Wait()
. ⚡ Чем нам поможет новая версия Go 1.25:
-
go vet
теперь автоматически ловит эту ошибку. - Появился удобный метод
WaitGroup.Go
, который сам делает Add
и Done
. Пример:
var wg sync.WaitGroup
// ❌ Неправильно
go func() {
wg.Add(1) // Add вызывается слишком поздно
defer wg.Done()
work()
}()
// ✅ Правильно
wg.Add(1) // Add вызываем до запуска
go func() {
defer wg.Done()
work()
}()
// ✅ Go 1.25
wg.Go(func() {
work()
})
❤17👍13🔥4
Митап для Go-разработчиков от МТС
11 сентября | 19:00
Офлайн в Москве | Онлайн
О чем поговорим:
🔹LLM для конкурентного Go кода;
🔹WaitGroup Pitfalls;
🔹Эффективное использование sync.Map в Go;
🔹Разработка Cloud Controller Manager: интеграция Kubernetes с облаком MWS.
Воркшоп, доклады и нетворкинг на баскетбольной арене.
Присоединяйся! Для участия зарегистрируйся по ссылке.
11 сентября | 19:00
Офлайн в Москве | Онлайн
О чем поговорим:
🔹LLM для конкурентного Go кода;
🔹WaitGroup Pitfalls;
🔹Эффективное использование sync.Map в Go;
🔹Разработка Cloud Controller Manager: интеграция Kubernetes с облаком MWS.
Воркшоп, доклады и нетворкинг на баскетбольной арене.
Присоединяйся! Для участия зарегистрируйся по ссылке.
👍2
Поддержка сложных структур: Gjson позволяет работать с вложенными объектами и массивами в JSON-данных.
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳5❤3🔥2🕊1
⚡ Or-channel паттерн в Go — мощный приём для работы с конкурентностью.
Он позволяет объединять несколько done-каналов в один общий.
Как только закрывается любой из входных каналов — автоматически закрывается и новый канал.
Такой подход даёт единый сигнал для завершения или отмены операции.
#golang
Он позволяет объединять несколько done-каналов в один общий.
Как только закрывается любой из входных каналов — автоматически закрывается и новый канал.
Такой подход даёт единый сигнал для завершения или отмены операции.
#golang
🔥17🥴11👍7❤5
🔥 Успех в IT = скорость + знания + окружение
Здесь ты найдёшь всё это — коротко, по делу и без воды.
Пока другие ищут, где “подглядеть решение”, ты уже используешь самые свежие инструменты!
AI: t.iss.one/ai_machinelearning_big_data
Python: t.iss.one/pythonl
Linux: t.iss.one/linuxacademiya
Собеседования DS: t.iss.one/machinelearning_interview
C++ t.iss.one/cpluspluc
Docker: t.iss.one/DevopsDocker
Хакинг: t.iss.one/linuxkalii
Devops: t.iss.one/DevOPSitsec
Data Science: t.iss.one/data_analysis_ml
Javascript: t.iss.one/javascriptv
C#: t.iss.one/csharp_1001_notes
Java: t.iss.one/java_library
Базы данных: t.iss.one/sqlhub
Python собеседования: t.iss.one/python_job_interview
Мобильная разработка: t.iss.one/mobdevelop
Golang: t.iss.one/Golang_google
React: t.iss.one/react_tg
Rust: t.iss.one/rust_code
ИИ: t.iss.one/vistehno
PHP: t.iss.one/phpshka
Android: t.iss.one/android_its
Frontend: t.iss.one/front
Big Data: t.iss.one/bigdatai
МАТЕМАТИКА: t.iss.one/data_math
Kubernets: t.iss.one/kubernetc
Разработка игр: https://t.iss.one/gamedev
Haskell: t.iss.one/haskell_tg
Физика: t.iss.one/fizmat
💼 Папка с вакансиями: t.iss.one/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.iss.one/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.iss.one/addlist/mzMMG3RPZhY2M2Iy
😆ИТ-Мемы: t.iss.one/memes_prog
🇬🇧Английский: t.iss.one/english_forprogrammers
🧠ИИ: t.iss.one/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://t.iss.one/addlist/BkskQciUW_FhNjEy
Подпишись, если хочешь быть в числе тех, кого зовут в топовые проекты!
Здесь ты найдёшь всё это — коротко, по делу и без воды.
Пока другие ищут, где “подглядеть решение”, ты уже используешь самые свежие инструменты!
AI: t.iss.one/ai_machinelearning_big_data
Python: t.iss.one/pythonl
Linux: t.iss.one/linuxacademiya
Собеседования DS: t.iss.one/machinelearning_interview
C++ t.iss.one/cpluspluc
Docker: t.iss.one/DevopsDocker
Хакинг: t.iss.one/linuxkalii
Devops: t.iss.one/DevOPSitsec
Data Science: t.iss.one/data_analysis_ml
Javascript: t.iss.one/javascriptv
C#: t.iss.one/csharp_1001_notes
Java: t.iss.one/java_library
Базы данных: t.iss.one/sqlhub
Python собеседования: t.iss.one/python_job_interview
Мобильная разработка: t.iss.one/mobdevelop
Golang: t.iss.one/Golang_google
React: t.iss.one/react_tg
Rust: t.iss.one/rust_code
ИИ: t.iss.one/vistehno
PHP: t.iss.one/phpshka
Android: t.iss.one/android_its
Frontend: t.iss.one/front
Big Data: t.iss.one/bigdatai
МАТЕМАТИКА: t.iss.one/data_math
Kubernets: t.iss.one/kubernetc
Разработка игр: https://t.iss.one/gamedev
Haskell: t.iss.one/haskell_tg
Физика: t.iss.one/fizmat
💼 Папка с вакансиями: t.iss.one/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.iss.one/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.iss.one/addlist/mzMMG3RPZhY2M2Iy
😆ИТ-Мемы: t.iss.one/memes_prog
🇬🇧Английский: t.iss.one/english_forprogrammers
🧠ИИ: t.iss.one/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://t.iss.one/addlist/BkskQciUW_FhNjEy
Подпишись, если хочешь быть в числе тех, кого зовут в топовые проекты!
🥴1🐳1🤣1
🛠 Go tip: как правильно использовать
⚡ Важные моменты:
- GC может очистить пул — он не вечное хранилище.
- Объекты нужно сбрасывать перед возвратом, иначе вернутся «грязные» данные.
- Для больших или сильно разных по размеру объектов может привести к перерасходу памяти.
✅ Рекомендации:
- Использовать только для короткоживущих и предсказуемых объектов.
- Сбрасывать или обнулять состояние перед
- Профилировать приложение (`pprof`, `MemStats`) и смотреть эффект.
📌 Пример:
👉 Подробнее
sync.Pool
sync.Pool
— это потокобезопасный пул временных объектов в Go. Он помогает переиспользовать объекты, снижая аллокации и нагрузку на GC. Отлично подходит для буферов и временных структур. ⚡ Важные моменты:
- GC может очистить пул — он не вечное хранилище.
- Объекты нужно сбрасывать перед возвратом, иначе вернутся «грязные» данные.
- Для больших или сильно разных по размеру объектов может привести к перерасходу памяти.
✅ Рекомендации:
- Использовать только для короткоживущих и предсказуемых объектов.
- Сбрасывать или обнулять состояние перед
Put
. - Профилировать приложение (`pprof`, `MemStats`) и смотреть эффект.
📌 Пример:
var bufPool = sync.Pool{
New: func() interface{} {
return make([]byte, 1024) // создаём буфер 1КБ
},
}
func process() {
buf := bufPool.Get().([]byte)
defer bufPool.Put(buf[:0]) // сброс длины перед возвратом
// работа с buf...
}
👉 Подробнее
👍4❤1🔥1