Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
924 - Telegram Web
Telegram Web
Чем горутины в Go отличаются от потоков (threads)

Чтобы разобраться в том, как Go реализует параллельное выполнение задач, важно понимать различия между горутинами и потоками. Эти различия влияют на производительность, ресурсы и удобство работы с многозадачностью. Вот основные отличия горутин от потоков в Go:

➡️ Уровень абстракции
Горутины представляют собой абстракцию, встроенную в язык Go, которая позволяет выполнять функции или методы параллельно.
Потоки — это низкоуровневые объекты операционной системы, предназначенные для параллельного выполнения задач.


➡️ Размер стека
Горутины начинают с небольшого стека
(около 2 КБ), который может изменяться по мере необходимости.
Потоки обычно имеют фиксированный размер стека, который значительно больше, часто от 1 МБ и выше.


➡️ Создание и переключение
Горутины создаются с помощью ключевого слова go перед вызовом функции и требуют минимальных затрат на создание и переключение контекста.
Потоки стоят дороже как по времени создания, так и по затратам на переключение контекста, поскольку для этого необходимо взаимодействовать с операционной системой.


➡️ Планировщик
Горутины управляются планировщиком Go, работающим в пользовательском пространстве, который распределяет горутины по доступным потокам ОС
(обычно один поток на одно ядро процессора).
Потоки управляются планировщиком операционной системы.

➡️ Изоляция
Ошибка в одной горутине
(например, паника) может повлиять на остальные горутины в программе.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
В чём разница между следующими объявлениями массивов в Go

arr1 := [5]int{}
arr2 := [...]int{1, 2, 3}
arr3 := [...]int{}


1️⃣ вариант — arr1 := [5]int{}это явная инициализация массива длиной 5, где все элементы будут равны 0, потому что для типа int это значение по умолчанию.

2️⃣arr2 := [...]int{1, 2, 3}использует вывод длины массива: компилятор сам определяет, что длина должна быть 3, так как передано три элемента. Это удобно, когда длина очевидна из контекста.

А вот 3️⃣ arr3 := [...]int{} — это ошибка компиляции. Компилятор не сможет вывести длину массива из пустого литерала, и поэтому такой код не скомпилируется. Чтобы создать пустой массив, нужно использовать явно указанную длину, например: arr3 := [0]int{}.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Последняя неделя перед стартом курса по AI-агентам

Старт курса уже 5го числа! Если вы планировали вписаться — сейчас ПОСЛЕДНИЙ шанс забронировать место

На курсе:
разложим LLM по косточкам: токенизация, SFT, PEFT, инференс
— соберём RAG и научимся оценивать его адекватно
— построим настоящую мультиагентную систему — архитектуру, которая умеет расти
— разберём CoPilot, сломаем через prompt injection (спасибо Максу)
— и наконец, посмотрим, как это работает в MCP и реальных кейсах

📍 Это 5 живых вебинаров + раздатка + домашки + чат с преподавателями

И главное — возможность реально разобраться, как проектировать системы на LLM, а не просто «поиграться с API»

👉 Курс здесь
В чём суть и контекст применения Singleton в Go

Паттерн Singleton (Одиночка) — это порождающий паттерн проектирования, цель которого — гарантировать, что структура (или тип) имеет только один экземпляр и предоставляет глобальную точку доступа к нему.

➡️Когда использовать:
• Централизованное управление ресурсами: пул соединений, логгеры, кэш
• Избегание дублирования состояния в памяти
• Работа в многопоточной среде и потокобезопасный доступ к общей структуре


➡️ Когда не стоит использовать:
• Singleton нарушает SRP (единственная ответственность)
• Затрудняет тестирование (невозможно подменить зависимости)
• Провоцирует на глобальные сингл-точки сбоя (если объект упал — всё развалилось)
• Препятствует масштабируемости при переходе к микросервисной архитектуре


➡️ Важно: в Go нет классов и private конструкторов как в OOP-языках, поэтому реализация синглтона — технически иной подход, обычно через package-level переменные, sync и функции.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой контекст выбрать: context.Background() или context.TODO()

Когда вы работаете с Go-контекстами, легко запутаться: оба выглядят одинаково, оба ничего не делают — но используются по-разному.

context.Background() — это ваш "нулевой" контекст, от которого принято строить всё остальное. Он используется в main(), в инициализации, в серверах и корневых вызовах. Это базовая точка отсчёта.

context.TODO() — маркер, который говорит: "я ещё не знаю, какой контекст здесь будет, но он точно появится".
Такой контекст часто используется в заготовках, шаблонах, временном коде, пока архитектура не определена.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
2025/07/03 18:35:03
Back to Top
HTML Embed Code: