Anonymous Quiz
18%
errors.Fatal
3%
Автоматическая перезагрузку программы
5%
throw и catch
74%
panic и recover
😁10
⚡ Полезный приём в Go — используем
Например, при загрузке ENV-переменных:
Теперь переменные окружения загружаются лишь один раз, а дальше берутся из памяти.
#golang #concurrency #tips
sync.Once
, чтобы инициализировать значение только один раз. Например, при загрузке ENV-переменных:
package config
import (
"os"
"sync"
)
var (
loadOnce sync.Once
envVars map[string]string
)
func GetEnvVars() map[string]string {
loadOnce.Do(func() {
envVars = map[string]string{
"DB_URL": os.Getenv("DB_URL"),
"API_KEY": os.Getenv("API_KEY"),
}
})
return envVars
}
Теперь переменные окружения загружаются лишь один раз, а дальше берутся из памяти.
#golang #concurrency #tips
👎10❤5👍2🔥1
👍6❤2🔥1
Многие разработчики начинают с горутин и каналов, но быстро теряются: когда стоит использовать WaitGroup, а когда select? Как правильно закрывать каналы и избегать утечек горутин?
Ответы есть — в бесплатном онлайн-руководстве Go 101, которое разбирает конкурентность в Go максимально чётко и практично.
Вот ключевые главы, которые стоит пройти по порядку:
Goroutines: как Go управляет потоками, стеком и планировщиком
👉 go101.org/article/control-flows-more.html
Channels: основы синхронизации между горутинами и передача данных без блокировок
👉 go101.org/article/channel.html
Channel use cases: шаблоны, ошибки и приёмы для реальных задач — от worker pool до fan-in/fan-out
👉 go101.org/article/channel-use-cases.html
Synchronization overview: обзор всех инструментов — мьютексы, атомики, условия и таймеры
👉 go101.org/article/concurrent-synchronization-overview.html
После этих четырёх статей вы поймёте, почему конкурентность в Go - это не просто «многопоточность», а архитектурная философия языка.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🔥2👍1
Всё, что волнует Go-сообщество: 1 ноября пройдет Я.Субботник по Go.
На круглых столах обсудим самые актуальные и спорные темы — использование AI-инструментов, highload и, конечно, заглянем в будущее языка.
Старший разработчик Яндекс Маркета Александр Никитин поделится опытом трассировки логики с помощью Debug Tree. СТО Яндекс Игр Степан Пастерников разберёт использование K-V хранилищ и кэшей. А разработчик бэкенда Плюса и Финтеха Игорь Панасюк расскажет о новом garbage collector в Go 1.25 и о том, какие подходы применяются в управлении памятью.
Для тех, кто не сможет посетить митап в Москве, будет доступна онлайн-трансляция.
Регистрируемся
На круглых столах обсудим самые актуальные и спорные темы — использование AI-инструментов, highload и, конечно, заглянем в будущее языка.
Старший разработчик Яндекс Маркета Александр Никитин поделится опытом трассировки логики с помощью Debug Tree. СТО Яндекс Игр Степан Пастерников разберёт использование K-V хранилищ и кэшей. А разработчик бэкенда Плюса и Финтеха Игорь Панасюк расскажет о новом garbage collector в Go 1.25 и о том, какие подходы применяются в управлении памятью.
Для тех, кто не сможет посетить митап в Москве, будет доступна онлайн-трансляция.
Регистрируемся
❤2👍2🔥2🤬1
🧩 Go Квиз: оцените отношение времени g()/f()
#Golang
Идея проста: какая из функций будет «дороже» и во сколько раз?
- f делает три умножения на итерацию плюс запись в массив. Это «дешёвая» арифметика с линейным проходом по памяти.
- g на каждой итерации создаёт срез a[:] и вызывает doNothing. Если компилятор встраивает пустую функцию и выкидывает бесполезный срез, тело цикла почти исчезает. Если запретить инлайнинг, вы получите N вызовов функции и накладные расходы на создание среза на каждой итерации.
Чего ожидать?
С инлайнингом и DCE: g() часто быстрее f(), потому что почти ничего не делает, тогда как f() реально пишет в память. Отношение g()/f() < 1.
Без инлайнинга: g() резко замедляется из-за стоимости вызова функции и построения среза на каждой итерации. Отношение g()/f() ≫ 1, иногда на порядок.
Вывод: результат зависит от оптимизаций компилятора. «Смысл» цикла, который не производит наблюдаемых эффектов, Go охотно выкидывает.
Как проверить у себя
Что запомнить
- Микробенчи в Go чувствительны к инлайнингу и dead-code elimination.
- Запись в память удерживает цикл «реальным», тогда как пустые вызовы и срезы могут исчезнуть.
- Измеряйте обе конфигурации: с оптимизациями и без, чтобы понять истинную стоимость.
Если коротко:
- В реальном билде с оптимизациями g()/f() обычно < 1.
- С запретом инлайнинга g()/f() обычно ≫ 1 из-за накладных расходов вызова.
#Golang
Идея проста: какая из функций будет «дороже» и во сколько раз?
const N = 1 << 12
func f(){
for a, i := [N]int{}, 0; i < len(a); i++ {
a[i] = i * i * i * i
}
}
func doNothing(a []int) {}
func g(){
for a, i := [N]int{}, 0; i < len(a); i++ {
doNothing(a[:])
}
}
- f делает три умножения на итерацию плюс запись в массив. Это «дешёвая» арифметика с линейным проходом по памяти.
- g на каждой итерации создаёт срез a[:] и вызывает doNothing. Если компилятор встраивает пустую функцию и выкидывает бесполезный срез, тело цикла почти исчезает. Если запретить инлайнинг, вы получите N вызовов функции и накладные расходы на создание среза на каждой итерации.
Чего ожидать?
С инлайнингом и DCE: g() часто быстрее f(), потому что почти ничего не делает, тогда как f() реально пишет в память. Отношение g()/f() < 1.
Без инлайнинга: g() резко замедляется из-за стоимости вызова функции и построения среза на каждой итерации. Отношение g()/f() ≫ 1, иногда на порядок.
Вывод: результат зависит от оптимизаций компилятора. «Смысл» цикла, который не производит наблюдаемых эффектов, Go охотно выкидывает.
Как проверить у себя
Копировать код
# обычный режим
go test -bench . -benchmem
# отключить инлайнинг -l, чтобы увидеть цену вызова функции
go test -gcflags='-l' -bench . -benchmem
Что запомнить
- Микробенчи в Go чувствительны к инлайнингу и dead-code elimination.
- Запись в память удерживает цикл «реальным», тогда как пустые вызовы и срезы могут исчезнуть.
- Измеряйте обе конфигурации: с оптимизациями и без, чтобы понять истинную стоимость.
Если коротко:
- В реальном билде с оптимизациями g()/f() обычно < 1.
- С запретом инлайнинга g()/f() обычно ≫ 1 из-за накладных расходов вызова.
👍2🔥1