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

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

前往频道在 Telegram

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

显示更多

📈 Telegram 频道 Библиотека Go-разработчика | Golang 的分析概览

频道 Библиотека Go-разработчика | Golang (@goproglib) 俄语 语言赛道中的 是活跃参与者。目前社区聚集了 24 053 名订阅者,在 技术与应用 类别中位列第 5 416,并在 俄罗斯 地区排名第 27 441

📊 受众指标与增长动态

невідомо 创建以来,项目保持高速增长,吸引了 24 053 名订阅者。

根据 25 八月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 115,过去 24 小时变化为 -1,整体触达仍然可观。

  • 认证状态: 未认证
  • 互动率 (ER): 平均受众互动率为 15.32%。内容发布后 24 小时内通常能获得 8.08% 的反应,占订阅者总量。
  • 帖子覆盖: 每篇帖子平均可获得 3 683 次浏览,首日通常累积 1 942 次浏览。
  • 互动与反馈: 受众积极参与,单帖平均反应数为 20
  • 主题关注点: 内容集中在 навигация, лучшее_из_библиотеки_2025, git, string, golive 等核心主题上。

📝 描述与内容策略

作者将该频道定位为表达主观观点的平台:
Все самое полезное для Go-разработчика в одном канале. Учиться у нас: clc.to/qaSdww По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a4a8c24689c2151c752af0 #WXSSA

凭借高频更新(最新数据采集于 26 八月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。

24 053
订阅者
-124 小时
+27
+11530
吸引订阅者
八月 '26
八月 '26
+230
在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个频道中
日期
订阅者增长
提及
频道
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 217
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 502
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 689
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 733
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 126
7
Go-Go-Gadg...Error? Смотрим, как ошибаются Go разработчики! В Go разработчики ошибаются как и в любом другом языке: опечатки,
Go-Go-Gadg...Error? Смотрим, как ошибаются Go разработчики! В Go разработчики ошибаются как и в любом другом языке: опечатки, дубликаты, нерабочие условия проверок и тому подобное. Но почему? Ведь многие используют тот же go vet который прекрасно находит всё это… ведь так... да? На вебинаре разработчик PVS-Studio Глеб Асламов разберет частые и типовые ошибки Go разработчиков в известных проектах. А еще вы узнаете, какие ошибки не могут найти стандартные инструменты и подходы (и что с этим делать). Регистрируйтесь по ссылке! После вебинара все регистранты получат запись. Подписывайтесь на PVS-Studio, чтобы оставаться в курсе последних новостей о статическом анализе: — Telegram — MAX
3 222
8
🐸 Библиотека Go-разработчика #GoGiggle
🐸 Библиотека Go-разработчика #GoGiggle
3 208
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 207
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 139
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 339
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 868
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 598
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