ar
Feedback
Библиотека Go-разработчика | Golang

Библиотека Go-разработчика | Golang

الذهاب إلى القناة على Telegram

Все самое полезное для Go-разработчика в одном канале. Учиться у нас: clc.to/qaSdww По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a4a8c24689c2151c752af0 #WXSSA

إظهار المزيد

📈 نظرة تحليلية على قناة تيليجرام Библиотека Go-разработчика | Golang

تُعد قناة Библиотека Go-разработчика | Golang (@goproglib) في القطاع اللغوي الروسية لاعباً نشطاً. يضم المجتمع حالياً 24 055 مشتركاً، محتلاً المرتبة 5 371 في فئة التكنولوجيات والتطبيقات والمرتبة 27 230 في منطقة روسيا.

📊 مؤشرات الجمهور والحراك

منذ تأسيسه في невідомо، حقق المشروع نمواً سريعاً وجمع 24 055 مشتركاً.

بحسب آخر البيانات بتاريخ 26 أغسطس, 2026، تحافظ القناة على نشاط مستقر. خلال آخر 30 يوماً تغيّر عدد الأعضاء بمقدار 124، وفي آخر 24 ساعة بمقدار 8، مع بقاء الوصول العام مرتفعاً.

  • حالة التحقق: غير موثّقة
  • معدل التفاعل (ER): يبلغ متوسط تفاعل الجمهور 15.46‎%. وخلال أول 24 ساعة من النشر يحصد المحتوى عادةً 7.93‎% من ردود الفعل نسبةً إلى إجمالي المشتركين.
  • وصول المنشورات: يحصل كل منشور على متوسط 3 719 مشاهدة. وخلال اليوم الأول يجمع عادةً 1 908 مشاهدة.
  • التفاعلات والاستجابة: يتفاعل الجمهور بانتظام؛ متوسط التفاعلات لكل منشور يبلغ 20.
  • الاهتمامات الموضوعية: يركز المحتوى على مواضيع رئيسية مثل навигация, лучшее_из_библиотеки_2025, git, string, golive.

📝 الوصف وسياسة المحتوى

يصف المؤلف القناة بأنها مساحة للتعبير عن الآراء الذاتية:
Все самое полезное для Go-разработчика в одном канале. Учиться у нас: clc.to/qaSdww По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a4a8c24689c2151c752af0 #WXSSA

بفضل وتيرة التحديث المرتفعة (أحدث البيانات بتاريخ 27 أغسطس, 2026) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.

24 055
المشتركون
+824 ساعات
+117 أيام
+12430 أيام

جاري تحميل البيانات...

جذب المشتركين
أغسطس '26
أغسطس '26
+234
في 1 قنوات
يوليو '26
+221
في 2 قنوات
Get PRO
يونيو '26
+171
في 3 قنوات
Get PRO
مايو '26
+288
في 3 قنوات
Get PRO
أبريل '26
+249
في 1 قنوات
Get PRO
مارس '26
+216
في 1 قنوات
Get PRO
فبراير '26
+487
في 7 قنوات
Get PRO
يناير '26
+346
في 3 قنوات
Get PRO
ديسمبر '25
+370
في 4 قنوات
Get PRO
نوفمبر '25
+384
في 4 قنوات
Get PRO
أكتوبر '25
+331
في 2 قنوات
Get PRO
سبتمبر '25
+290
في 0 قنوات
Get PRO
أغسطس '25
+316
في 4 قنوات
Get PRO
يوليو '25
+317
في 2 قنوات
Get PRO
يونيو '25
+315
في 0 قنوات
Get PRO
مايو '25
+391
في 5 قنوات
Get PRO
أبريل '25
+358
في 4 قنوات
Get PRO
مارس '25
+625
في 53 قنوات
Get PRO
فبراير '25
+527
في 35 قنوات
Get PRO
يناير '25
+517
في 37 قنوات
Get PRO
ديسمبر '24
+591
في 40 قنوات
Get PRO
نوفمبر '24
+605
في 52 قنوات
Get PRO
أكتوبر '24
+499
في 36 قنوات
Get PRO
سبتمبر '24
+676
في 36 قنوات
Get PRO
أغسطس '24
+580
في 36 قنوات
Get PRO
يوليو '24
+586
في 37 قنوات
Get PRO
يونيو '24
+467
في 29 قنوات
Get PRO
مايو '24
+674
في 35 قنوات
Get PRO
أبريل '24
+771
في 36 قنوات
Get PRO
مارس '24
+901
في 31 قنوات
Get PRO
فبراير '24
+729
في 31 قنوات
Get PRO
يناير '24
+863
في 27 قنوات
Get PRO
ديسمبر '23
+850
في 29 قنوات
Get PRO
نوفمبر '23
+608
في 10 قنوات
Get PRO
أكتوبر '23
+697
في 25 قنوات
Get PRO
سبتمبر '23
+723
في 0 قنوات
Get PRO
أغسطس '23
+648
في 0 قنوات
Get PRO
يوليو '23
+503
في 0 قنوات
Get PRO
يونيو '23
+422
في 0 قنوات
Get PRO
مايو '23
+568
في 0 قنوات
Get PRO
أبريل '23
+365
في 0 قنوات
Get PRO
مارس '23
+841
في 0 قنوات
Get PRO
فبراير '23
+392
في 0 قنوات
Get PRO
يناير '23
+395
في 0 قنوات
Get PRO
ديسمبر '22
+384
في 0 قنوات
Get PRO
نوفمبر '22
+491
في 0 قنوات
Get PRO
أكتوبر '22
+256
في 0 قنوات
Get PRO
سبتمبر '22
+292
في 0 قنوات
Get PRO
أغسطس '22
+394
في 0 قنوات
Get PRO
يوليو '22
+472
في 0 قنوات
Get PRO
يونيو '22
+443
في 0 قنوات
Get PRO
مايو '22
+176
في 0 قنوات
Get PRO
أبريل '22
+328
في 0 قنوات
Get PRO
مارس '22
+242
في 0 قنوات
Get PRO
فبراير '22
+135
في 0 قنوات
Get PRO
يناير '22
+236
في 0 قنوات
Get PRO
ديسمبر '21
+245
في 0 قنوات
Get PRO
نوفمبر '21
+219
في 0 قنوات
Get PRO
أكتوبر '21
+215
في 0 قنوات
Get PRO
سبتمبر '21
+290
في 0 قنوات
Get PRO
أغسطس '21
+298
في 0 قنوات
Get PRO
يوليو '21
+281
في 0 قنوات
Get PRO
يونيو '21
+196
في 0 قنوات
Get PRO
مايو '21
+389
في 0 قنوات
Get PRO
أبريل '21
+336
في 0 قنوات
Get PRO
مارس '21
+280
في 0 قنوات
Get PRO
فبراير '21
+258
في 0 قنوات
Get PRO
يناير '21
+262
في 0 قنوات
Get PRO
ديسمبر '20
+6 566
في 0 قنوات
التاريخ
نمو المشتركين
الإشارات
القنوات
27 أغسطس+4
26 أغسطس+12
25 أغسطس+8
24 أغسطس+5
23 أغسطس+2
22 أغسطس+3
21 أغسطس+9
20 أغسطس+7
19 أغسطس+3
18 أغسطس+12
17 أغسطس+11
16 أغسطس+7
15 أغسطس+5
14 أغسطس+6
13 أغسطس+9
12 أغسطس+16
11 أغسطس+15
10 أغسطس+10
09 أغسطس+6
08 أغسطس+10
07 أغسطس+9
06 أغسطس+16
05 أغسطس+7
04 أغسطس+10
03 أغسطس+13
02 أغسطس+8
01 أغسطس+11
منشورات القناة
✏️ Расстояния между единицами: находим нужный паттерн Дан массив нулей и единиц, нужно проверить, что между любыми двумя единицами находится минимум k нулей. Звучит элементарно, но в реализации легко споткнуться. Массив [1,0,0,0,1,0,0,1] при k=2 валиден: между первой и второй единицей три нуля (достаточно), между второй и третьей — два нуля (достаточно). А вот [1,0,1,0,0,1] при k=2 — нет, потому что первые две единицы разделены только одним нулём. Запоминаем позицию последней найденной единицы. Когда встречаем новую, проверяем расстояние до неё и сразу обновляем позицию. Это будет один проход по массиву:

func kLengthApart(nums []int, k int) bool {
    lastPos := -k - 1
    
    for i := 0; i < len(nums); i++ {
        if nums[i] == 1 {
            if i - lastPos - 1 < k {
                return false
            }
            lastPos = i
        }
    }
    return true
}
Результат: O(n) время, O(1) память. 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека Go-разработчика #ReadySetGo

2
🛠️ sqlc: пишешь SQL → получаешь типобезопасный Go Вместо ORM и ручного Scan можно оставить SQL как есть, а Go-код сгенериров
🛠️ sqlc: пишешь SQL → получаешь типобезопасный Go Вместо ORM и ручного Scan можно оставить SQL как есть, а Go-код сгенерировать: -- name: GetAuthor :one SELECT id, name, bio FROM authors WHERE id = $1; sqlc generate После генерации: author, err := queries.GetAuthor(ctx, id) sqlc проверяет запросы относительно схемы и генерирует типизированные структуры и методы. Поддерживаются PostgreSQL, MySQL и SQLite. ⚡️ Документация 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
2 310
3
🛡 Go tip: не открывайте локальный сервис наружу случайно Если HTTP-сервис должен быть доступен только на вашей машине, слуша
🛡 Go tip: не открывайте локальный сервис наружу случайно Если HTTP-сервис должен быть доступен только на вашей машине, слушайте 127.0.0.1, а не 0.0.0.0: srv := &http.Server{ Addr: "127.0.0.1:8001", } 127.0.0.1 — только локальный интерфейс. А: Addr: "0.0.0.0:8001» означает прослушивание всех IPv4-интерфейсов. 📌 Для локальных админок, debug-сервисов и dev-инструментов это простая настройка, которую легко забыть — и случайно выставить сервис в сеть. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
2 524
4
💡 Как append растит слайс Все знают, что append добавляет элемент в слайс. А вот что происходит, когда место в массиве кончилось, знают не всегда, и как раз тут прячется пара неожиданностей. 🔵 Пока есть запас У слайса есть len и cap. Пока len меньше cap, append дописывает элемент прямо в тот же массив и возвращает слайс, который смотрит туда же. Никакого копирования, дёшево. Именно поэтому два слайса, делящие один массив, могут внезапно перетирать данные друг друга при append в один из них. 🔵 Когда запас кончился Как только cap исчерпан, рантайм выделяет новый массив побольше, копирует туда старые элементы и возвращает слайс уже на новую память. С этого момента старый и новый слайс не связаны, и запись в один не видна в другом. Отсюда правило, которое многих спасало от багов. Всегда присваивайте результат обратно. s = append(s, x) 🔵 На сколько растёт Точный коэффициент это деталь реализации, которая менялась от версии к версии, поэтому закладываться на конкретное число не стоит. Грубый ориентир такой. Маленькие слайсы растут примерно вдвое, большие прибавляют около четверти за раз, а переход между режимами сглажен в районе нескольких сотен элементов. Смысл в том, чтобы амортизировать стоимость и не копировать массив на каждом добавлении. Если вы заранее знаете примерный размер, выделяйте вместимость сразу. s := make([]int, 0, n) for i := 0; i < n; i++ { s = append(s, f(i)) } Так вы избегаете череды перевыделений и копирований, а заодно снимаете нагрузку со сборщика мусора. На горячих циклах это заметно. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoDeep
2 724
5
⚙️ Go tip: errgroup вместо ручного управления группой горутин Нужно параллельно выполнить несколько задач, остановиться при ошибке и ограничить количество одновременно работающих операций? Вместо WaitGroup + канала ошибок можно использовать golang.org/x/sync/errgroup: g, ctx := errgroup.WithContext(ctx) g.SetLimit(8) for _, url := range urls { g.Go(func() error { return fetch(ctx, url) }) } if err := g.Wait(); err != nil { return err } WithContext отменяет контекст при первой ошибке, SetLimit(8) держит максимум 8 активных горутин, а Wait() возвращает ошибку. 🔗 Источник 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
2 787
6
🔎 Go tip: откуда в проекте взялась эта зависимость? Нашли незнакомый модуль в go.mod и не понимаете, кто его подтянул? Помож
🔎 Go tip: откуда в проекте взялась эта зависимость? Нашли незнакомый модуль в 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 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
3 140
7
Go-Go-Gadg...Error? Смотрим, как ошибаются Go разработчики! В Go разработчики ошибаются как и в любом другом языке: опечатки,
Go-Go-Gadg...Error? Смотрим, как ошибаются Go разработчики! В Go разработчики ошибаются как и в любом другом языке: опечатки, дубликаты, нерабочие условия проверок и тому подобное. Но почему? Ведь многие используют тот же go vet который прекрасно находит всё это… ведь так... да? На вебинаре разработчик PVS-Studio Глеб Асламов разберет частые и типовые ошибки Go разработчиков в известных проектах. А еще вы узнаете, какие ошибки не могут найти стандартные инструменты и подходы (и что с этим делать). Регистрируйтесь по ссылке! После вебинара все регистранты получат запись. Подписывайтесь на PVS-Studio, чтобы оставаться в курсе последних новостей о статическом анализе: — Telegram — MAX
3 252
8
🐸 Библиотека Go-разработчика #GoGiggle
🐸 Библиотека Go-разработчика #GoGiggle
3 226
9
⏱️ testing/synctest: тестируем время и горутины без Sleep на секунды Тесты конкурентного кода часто либо долго выполняются из
⏱️ testing/synctest: тестируем время и горутины без Sleep на секунды Тесты конкурентного кода часто либо долго выполняются из-за реального времени, либо флакают из-за гонок. В 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 входит в стандартную библиотеку. 🔗 Источник 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
3 267
10
💡 Что внутри у any Раньше мы разбирали, что обычный интерфейс это структура из двух указателей, на таблицу типа и на данные. Пустой интерфейс, он же any, устроен похоже, но проще, и об этом стоит знать отдельно. 🟢 Две разные структуры Непустой интерфейс в рантайме это iface. Внутри у него itab, где лежат тип интерфейса, конкретный тип, хеш и таблица методов. У пустого интерфейса методов нет, значит и таблица методов ему не нужна. Поэтому any представлен другой, более лёгкой структурой, eface. type eface struct { _type *_type data unsafe.Pointer } Здесь _type это указатель на описание конкретного типа, а data это указатель на само значение. Никакого itab и списка методов, потому что вызывать через any всё равно нечего. Из-за этого приведение типа и type switch по any сводятся к сравнению указателя на тип, без похода в таблицу методов. 🟢 Классическая ловушка с nil Из устройства следует известный подвох. Интерфейс равен nil, только когда оба поля пустые, и тип, и данные. Стоит завернуть в интерфейс нетипизированный `nil`-указатель, и получится интерфейс, у которого тип уже не пустой. var p *MyError = nil var err error = p fmt.Println(err == nil) // false Тип внутри err теперь *MyError, поэтому сравнение с nil даёт false, хотя указатель внутри нулевой. Отсюда практичное правило. Возвращайте из функций именно nil литералом, а не заранее объявленную типизированную переменную, если хотите, чтобы вызывающий код честно увидел nil. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoDeep
3 183
11
Вам доклады по Go или Java? VK приглашает на митап с двойной начинкой 26 августа VK собирает Go- и Java-инженеров, чтобы прок
Вам доклады по 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. Участие бесплатное, регистрация обязательна.
2 729
12
⏱️ Go 1.27: ещё одно изменение, которое стоит проверить в старом коде В прошлом посте разбирали дженерик-методы, которые появ
⏱️ Go 1.27: ещё одно изменение, которое стоит проверить в старом коде В прошлом посте разбирали дженерик-методы, которые появятся в Go 1.27. Но в релизе есть и менее заметное изменение — окончательно убирают GODEBUG=asynctimerchan. Этот переключатель временно возвращал старое поведение time.Timer и time.Ticker из Go 1.22 и более ранних версий. С Go 1.27 таймерные каналы окончательно становятся синхронными. Поэтому старый код вроде: if !t.Stop() { <-t.C } t.Reset(d) теперь стоит пересмотреть: ручное вычитывание канала перед Reset больше не требуется и может привести к блокировке. 📌 Если уже готовитесь к Go 1.27, проверьте по проекту: ⬆️ asynctimerchan → удалить ⬆️ Stop() + <-t.C → проверить ⬆️ Stop() + Reset() → проверить 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoLive
3 379
13
🔥 Go 1.27 наконец разрешит дженерик-методы Дженерики появились ещё в 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, релиз ожидается в августе. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoLive
4 902
14
❓ Что на самом деле лежит внутри слайса Слайс — не массив, а небольшая структура: type slice struct { array unsafe.Pointer len int cap int } array указывает на массив с данными, len хранит текущую длину, cap — доступную вместимость. Отсюда две важные особенности. 1️⃣ Срез не копирует данные s2 := s1[1:3] s1 и s2 смотрят в один массив. Изменение элемента через s2 может быть видно через s1. 2️⃣ А вот append может разорвать эту связь Пока хватает cap → запись идёт в существующий массив. Не хватает cap → выделяется новый backing array, элементы копируются туда. Поэтому два слайса могут сначала делить память, а после append — уже нет. И наоборот, append без реаллокации способен неожиданно изменить данные, доступные через соседний слайс. 💡 Есть способ контролировать такое поведение через s[low:high:max] — разберём отдельно. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoDeep
4 866
15
🤷‍♂️ Почему Go удобен для AI-кодинга Команда Go выпустила разбор о том, почему язык хорошо подходит для работы с AI-агентами
🤷‍♂️ Почему Go удобен для AI-кодинга Команда Go выпустила разбор о том, почему язык хорошо подходит для работы с AI-агентами. Ключевой аргумент — Go легко проверять: ⬆️gofmt стандартизирует код ⬆️компилятор ловит ошибки ⬆️типов и выдуманные API ⬆️тесты и fuzzing встроены в ⬆️toolchain govulncheck проверяет ⬆️уязвимые зависимости ⬆️go fix и gopls помогают с ⬆️рефакторингом Когда агент пишет код быстрее, чем человек успевает его читать, предсказуемость языка становится отдельным преимуществом. Go + AI — мэтч или удачный маркетинг ❓ 🔥 — Мэтч: агентам нужны строгие рамки 🌚 — Маркетинг: агент нагенерит приключений на любом языке 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoLive
4 650
16
🐸 Библиотека Go-разработчика #GoGiggle
🐸 Библиотека Go-разработчика #GoGiggle
4 449
17
✅ Красивые таблицы в Go Иногда данные хочется вывести не просто строками в консоль, а в аккуратной читаемой таблице. Чтобы не изобретать велосипеды с 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 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
4 056
18
MWS проведет онлайн-митап для Go-разработчиков. 11 августа в 15:00 подключайся к эфиру: тебя ждут доклады экспертов и ответы
MWS проведет онлайн-митап для Go-разработчиков.  11 августа в 15:00 подключайся к эфиру: тебя ждут доклады экспертов и ответы на вопросы участников.  В программе митапа: — «Построение агентов на A2A с изолированным исполнением на Go» от MWS DevRails; — «Как разрабатывать эффективные и экономичные Kubernetes-операторы на Go» от Cloud.ru;  — «Точный Rate Limiting на API Gateway в мульти-ЦОД инфраструктуре» от MWS Octapi; — «Взросление OpenAPI-кодогенерации» от MWS Cloud Platform. Узнай больше о докладах, регистрируйся и добавляй в календарь по ссылке. Реклама. О рекламодателе | Сделано в WOWBLOGGER
3 845
19
🫣 Почему for range иногда работает не так, как ожидаешь for range выглядит простой конструкцией, но именно с ним связано множество неочевидных ошибок. Разберём три самые распространённые. 1. Переменная цикла содержит копию элемента При обходе слайса значение элемента записывается в переменную цикла: users := []User{ {Name: "Alice"}, {Name: "Bob"}, } for _, user := range users { user.Name = strings.ToUpper(user.Name) } Исходный слайс не изменится. user — это копия структуры, а не сам элемент. ➡️ Если нужно изменить данные, работайте через индекс: for i := range users { users[i].Name = strings.ToUpper(users[i].Name) } Для слайса указателей поведение будет другим: копируется указатель, а не объект, на который он указывает. 2. Адрес переменной цикла — не адрес элемента Такой код встречается довольно часто: var result []*User for _, user := range users { result = append(result, &user) } Начиная с Go 1.22 при использовании := каждая итерация получает собственную переменную цикла, поэтому указатели больше не будут ссылаться на одну и ту же переменную, как это происходило раньше. Но &user всё равно указывает на копию элемента, а не на элемент исходного слайса. ➡️ Если нужны адреса элементов, используйте индекс: for i := range users { result = append(result, &users[i]) } Если же переменная объявлена заранее и используется присваивание =, она по-прежнему переиспользуется между итерациями. 3. Изменение коллекции во время обхода Для слайсов выражение после range вычисляется один раз — до начала цикла. Поэтому количество итераций определяется исходной длиной слайса. numbers := []int{1, 2, 3} for _, n := range numbers { numbers = append(numbers, n) } Добавленные элементы в текущий обход автоматически не попадут. Кроме того, append может выделить новый underlying array, поэтому изменять слайс во время обхода стоит с осторожностью. ➡️ С map правила другие: for key := range cache { delete(cache, key) } Удалять элементы во время обхода разрешено. А вот элементы, добавленные в процессе итерации, могут как попасть в текущий обход, так и быть пропущены — спецификация этого не гарантирует. Порядок обхода map также не определён. И помните: одновременно читать и изменять map из разных горутин без синхронизации нельзя. for range скрывает немало деталей реализации. Если помнить, что переменная цикла часто содержит копию элемента, а поведение зависит от типа коллекции, многих неприятных ошибок удастся избежать. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
3 481
20
👨‍💻 Команды терминала, которые должен знать каждый разработчик Многие знакомы с cd, ls, pwd, но под капотом терминала — мор
👨‍💻 Команды терминала, которые должен знать каждый разработчик Многие знакомы с cd, ls, pwd, но под капотом терминала — море полезных шорткатов и трюков. Вот список тех, которые экономят время, исправляют ошибки и упрощают работу: 🔴 Запуск предыдущей команды — !! Бывает забываешь написать sudo, тогда можно просто sudo !! 🔴 Заменить очепятку и выполнить команду заново — ^old^new 🔴 Заменить все вхождения в команде — !!:gs/old/new/ 🔴 Поиск по тексту в файлах — grep -R "pattern" . 🔴 Открыть последнюю команду в редакторе для редактирования — fc 🔴 Проверка доступности порта — nc -zv <host> <port> 🔴 Проверить чем занят порт — lsof -i :<port> 🐸Библиотека Go-разработчика #GoToProduction
3 393