Фаззинг-тест начинается с
func Fuzz и принимает *testing.F:func FuzzParse(f *testing.F) {
// Seed-корпус
f.Add("valid input")
f.Add("edge case")
// Фаззинг-функция
f.Fuzz(func(t *testing.T, input string) {
result, err := Parse(input)
if err != nil {
return // Ошибка — нормально
}
// Проверки инвариантов
if result == nil {
t.Error("результат не должен быть nil при отсутствии ошибки")
}
})
}Часто тестируемая функция принимает сложные типы, а фаззер работает только с базовыми:
string, []byte, int, bool и несколькими другими. Обёртка конвертирует примитивы в нужные структуры: func FuzzUserValidation(f *testing.F) {
f.Add("john@example.com", 25, true)
f.Fuzz(func(t *testing.T, email string, age int, active bool) {
// Обёртка: преобразуем примитивы в структуру
user := User{
Email: email,
Age: age,
Active: active,
}
err := ValidateUser(user)
// Проверяем инварианты
if age < 0 && err == nil {
t.Error("отрицательный возраст должен вызывать ошибку")
}
})
}🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Флаг
CGO_ENABLED=0 вырубает CGo на При
CGO_ENABLED=1 компилятору нужны CGO_ENABLED=0 просто делаете GOOS=linux GOARCH=arm64 go build — и готово, бинарник для Можно использовать минималистичные образы типа scratch или distroless — приложение запустится
Убирая C-код, вы автоматически избавляетесь от целого класса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Каждый .go файл стартует с декларации
package название — это определяет, к какой логической группе относится код.Пакет с именем
main компилируется в main — это библиотеки для Никаких магических автоимпортов — каждую зависимость
import "github.com/user/repo/pkg". Go-компилятор сразу видит все связи между модулями.Простое, но мощное правило:
PublicFunc() — заглавная буква, privateFunc() — строчная буква, видна Это работает для всего: функций, типов, структур, переменных. Никаких ключевых слов public/private — компилятор смотрит только на первую букву.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Стандартная функция
time.Sleep() в Go имеет существенный недостаток — она блокирует выполнение и Вместо прямого использования
time.Sleep() можно комбинировать select с time.After() и каналом контекста:select {
case <-time.After(duration):
// Пауза завершилась естественным образом
case <-ctx.Done():
// Контекст отменён — немедленно выходим
return ctx.Err()
}Такой подход позволяет горутине мгновенно реагировать на отмену контекста.
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8😁1
«Этот манёвр будет стоить нам 51 год...»
На собеседованиях по
В Proglib Academy поднимаются цены. У вас есть шанс зайти на обучение по старой стоимости:
— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования
Забрать базу для собеседований
⚠️ Цены вырастут уже 19 января
На собеседованиях по
Go всё чаще спрашивают не только про горутины и каналы, но и про фундаментальные алгоритмы и архитектуру высоконагруженных систем. Не ждите, пока пробелы в знаниях станут критическими.В Proglib Academy поднимаются цены. У вас есть шанс зайти на обучение по старой стоимости:
— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования
Забрать базу для собеседований
⚠️ Цены вырастут уже 19 января
Планировщик Go реализует модель M:N, где M
В его основе лежат три ключевые сущности:
G (
M (
P (
Горутины хранятся в
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2🤩1
Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментах.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍6😢3🥱3🔥2
Строки в Go
Для построения строк используйте
Пример с strings.Builder:
var builder strings.Builder
for i := 0; i < 1000; i++ {
builder.WriteString("x")
}
result := builder.String()
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤🔥4
Deadlock возникает, когда все горутины
Типичные причины дедлоков: отправка в небуферизованный канал без
Примеры:
// Пример 1: отправка без получателя
ch := make(chan int)
ch <- 1 // deadlock - никто не читает
// Пример 2: чтение без отправителя
ch := make(chan int)
<-ch // deadlock - никто не пишет
// Пример 3: взаимная блокировка
var mu1, mu2 sync.Mutex
go func() {
mu1.Lock()
mu2.Lock() // ждет mu2
}()
mu2.Lock()
mu1.Lock() // ждет mu1
Используйте
select с default или Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
ЭТОТ ПОСТ СПАСЕТ ТВОЙ 👩💻 -СОБЕС
В наше время очень тяжело попасть на собеседование! Поэтому предлагаем вам очень серьезно относиться к ним.
Не упускайте не единое собеседование, готовьтесь к каждому, как к последнему.
Регулярно проверяйте свои hard-skills.
Забирай чек-лист из закрепленного сообщения - 55 вопросов из реальных собесов!
P.S. помимо непосредственно GO, разбираем другие необходимые технологии, про них нельзя забывать!
Помни, что каждое собеседование в 2026 на вес золота!
В наше время очень тяжело попасть на собеседование! Поэтому предлагаем вам очень серьезно относиться к ним.
Не упускайте не единое собеседование, готовьтесь к каждому, как к последнему.
Регулярно проверяйте свои hard-skills.
Забирай чек-лист из закрепленного сообщения - 55 вопросов из реальных собесов!
P.S. помимо непосредственно GO, разбираем другие необходимые технологии, про них нельзя забывать!
Помни, что каждое собеседование в 2026 на вес золота!
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1🌚1
append возвращает слайс, потому что операция добавления элементов может привести к capacity недостаточна.Поэтому если бы append
Даже если реаллокация не произошла и базовый массив остался тем же, возвращаемый слайс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Главное отличие — в диапазоне значений, которые можно хранить.
Int — это
UInt —
Практический пример для 8-битных типов:
Int8: от -128 до 127
UInt8: от
Оба занимают одинаковое количество памяти, но UInt может хранить в два раза большее положительное число за счёт
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2