👣 Вот ещё одна задача на Go, которая проверяет знание интерфейсов, nil и типов - частая ловушка даже для опытных разработчиков package main import ( "errors" "fmt" ) type myError struct{} func (m myError) Error() string { return "something went wrong" } func returnsNilError() error { var e myError = nil return e } func main() { err := returnsNilError() fmt.Println("err == nil:", err == nil) // неожиданно false fmt.Println("err:", err) } Вывод: err == nil: false err: something went wrong ⚡️ Запл...
Go tests
По всем вопросам- @haarrp @itchannels_telegram - 🔥полезные ит-каналы https://t.me/Golang_google - Golang программирование @golangl - golang chat @GolangJobsit - golang channel jobs @golang_jobsgo - go chat jobs
Графики
📊 Средний охват постов
📉 ERR % по дням
📋 Публикации по дням
📎 Типы контента
Лучшие публикации
20 из 20🚀 Как Go 1.26 ловит утечки горутин Перед тобой классический пример утечки goroutine, который долгое время было сложно отлавливать автоматически. Проблема возникает, когда: - используются небуферизированные каналы - запускаются goroutine в цикле - происходит ранний return по ошибке В такой ситуации часть goroutine продолжает попытки записи в канал, но получателя уже нет — они зависают навсегда. Раньше такие баги: - проявлялись только под нагрузкой - маскировались как рост памяти или странные тай...
🎄 Новогодняя елка на Golang 🎁 Как быстро быстро вывести новогоднюю ёлку в консоль, используя вложенные циклы и простую работу со строками. Отличный пример для тренировки логики и работы с циклами. Подписывайся, больше фишек каждый день ! package main import "fmt" func main() { height := 8 for i := 1; i <= height; i++ { // пробелы for s := 0; s < height-i; s++ { fmt.Print(" ") } // ветви for j := 0; j < 2i-1; j++ { fmt.Print("") } fmt.Println() } // ствол for i := 0; i < 2; i++ { for s := 0; s ...
👣 Go 1.26: bytes.Buffer.Peek() - заглянуть в буфер без чтения В Go 1.26 добавили очень удобный метод: Buffer.Peek(n) в пакете bytes. Что делает: - возвращает следующие N байт - не сдвигает указатель чтения - то есть можно “подсмотреть”, что впереди, и не портить поток Это идеальная штука для: - парсеров протоколов - stream processing - проверок заголовков/сигнатур - peek-before-read логики Важный нюанс: Peek() возвращает срез, который указывает прямо на внутренний буфер. То есть: - он валиден, ...
👣 Что выведет программа построчно? package main import "fmt" func main() { s := make([]int, 2, 3) s[0], s[1] = 1, 2 a := s[:2] b := append(s, 3) modify(a) modify(b) fmt.Println(s) fmt.Println(a) fmt.Println(b) } func modify(x []int) { x = append(x, 100) x[0] = 999 } - Какие append используют тот же underlying array, а какие нет? - В какой момент происходит реаллокация памяти? Подсказка: s, a и b сначала делят один backing array, но не все изменения доходят до всех слайсов. Ответ: [999 2] [999 2...
🚀 САМЫЙ ЭФФЕКТИВНЫЙ АЛГОРИТМ ПОИСКА В GO Бинарный поиск - один из самых быстрых способов найти элемент в отсортированном слайсе. Вместо полного прохода он делит диапазон пополам, работая за O(log n). Используй его везде, где данные можно заранее отсортировать - прирост скорости огромный. package main import "fmt" func binSearch(a []int, t int) bool { l, r := 0, len(a)-1 for l <= r { m := (l + r) / 2 if a[m] == t { return true } if a[m] < t { l = m + 1 } else { r = m - 1 } } return false } func ...
👣 Понимание выравнивания памяти в Go В Go важно понимать, как компилятор размещает данные в памяти - это напрямую влияет на скорость работы и объём используемой памяти. Что такое выравнивание? Выравнивание памяти - это правило: данные должны находиться по адресам, кратным их размеру. Это нужно, чтобы процессор мог читать и записывать значения за одну операцию. Например: - int64 требует выравнивания по 8 байтам - int32 - по 4 байтам - byte - по 1 байту Если значение лежит “неудобно”, CPU делает ...
❓ Что выведет программа? И объясни, почему вывод - НЕ тот, который ожидает большинство 🙂 package main import "fmt" func main() { s := []int{1, 2, 3, 4} t := s[:2] // [1 2] u := s[2:] // [3 4] // Изменяем через t t = append(t, 9) // Изменяем через u u[0] = 99 fmt.Println("s:", s) fmt.Println("t:", t) fmt.Println("u:", u) } 🔥 Разбор t := s[:2] и u := s[2:] смотрят на один и тот же underlying array но append(t, 9) может либо • дописать в тот же массив, либо • выделить новый, если capacity закончи...
Это один из самых любимых вопросов на 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]) } Разбор go a := make([]int, 2, 4) len = 2 cap = 4 underlying array = [1, 2, _, _] Слайс - это структура: go pointer -> array len cap При передаче в функци...
👣 Как работает планировщик задач в Golang под капотом Планировщик задач в Golang работает по схеме G-P-M: горутины (G) распределяются по логическим процессорам (P), а те в свою очередь выполняются на системных потоках (M). Так достигается мультиплексирование миллионов горутин на ограниченное число потоков ОС. Когда горутина блокируется (syscall, mutex, канал без данных) - её паркуют, а поток освобождают. Когда появляется работа — планировщик перебрасывает G между очередями P и старается держать...