💬 Какие ограничения у традиционного механизма TCP Keepalive в современной архитектуре и как работает Keepalive в контексте межсервисного взаимодействия?
Традиционный механизм TCP Keepalive работает на 4-м уровне модели OSI и позволяет двум узлам поддерживать активное соединение, периодически отправляя друг другу сигналы. Когда узел получает такой сигнал (keepalive probe), он отвечает сообщением ACK, подтверждая свою доступность. Если ответ не приходит в течение заданного времени, узел предполагает, что соединение потеряно. Это эффективно в традиционных сетях.
Однако в современной архитектуре с использованием виртуализации, контейнеризации и прокси-серверов механизм TCP Keepalive имеет ограничение. Он проверяет состояние ближайшего посредника (например, прокси), а не конечного узла, что делает его ненадёжным для сложных сетей. В такой ситуации TCP Keepalive необходимо настраивать на каждом уровне (клиент, прокси и сервер) для гарантии доступности конечного узла.
👉 Подробнее
Традиционный механизм TCP Keepalive работает на 4-м уровне модели OSI и позволяет двум узлам поддерживать активное соединение, периодически отправляя друг другу сигналы. Когда узел получает такой сигнал (keepalive probe), он отвечает сообщением ACK, подтверждая свою доступность. Если ответ не приходит в течение заданного времени, узел предполагает, что соединение потеряно. Это эффективно в традиционных сетях.
Однако в современной архитектуре с использованием виртуализации, контейнеризации и прокси-серверов механизм TCP Keepalive имеет ограничение. Он проверяет состояние ближайшего посредника (например, прокси), а не конечного узла, что делает его ненадёжным для сложных сетей. В такой ситуации TCP Keepalive необходимо настраивать на каждом уровне (клиент, прокси и сервер) для гарантии доступности конечного узла.
👉 Подробнее
Хабр
Остаться в живых (keepalive) feat. HTTP/2, Go & gRPC-Go
Привет, Хабр! :-) Меня зовут Ильяс. В этой статье мы разберём известную идею — keepalive в межсервисном взаимодействии, которая спасла уже не одну компанию в трудное время :). Но чтобы добавить...
❤7👍1
Forwarded from Библиотека программиста | программирование, кодинг, разработка
🔀 Команды git merge и git rebase: преимущества, недостатки и ключевые различия
Один из ключевых аспектов работы с системой контроля версий Git — перенос изменений из одной ветки в другую. Для этого существует два основных инструмента: git merge и git rebase.
Хотя они решают одну и ту же задачу по интеграции кода, делают они это разными способами. Разберемся, как именно работают git merge и git rebase, и какую опцию стоит выбрать в конкретной ситуации.
🔗 Читать статью
🔗 Зеркало
Один из ключевых аспектов работы с системой контроля версий Git — перенос изменений из одной ветки в другую. Для этого существует два основных инструмента: git merge и git rebase.
Хотя они решают одну и ту же задачу по интеграции кода, делают они это разными способами. Разберемся, как именно работают git merge и git rebase, и какую опцию стоит выбрать в конкретной ситуации.
🔗 Читать статью
🔗 Зеркало
👍4
💬 Какой способ лучше использовать в Go для проверки пустой строки:
Оба способа корректны и часто используются в Go. Однако предпочтительнее использовать
Использование
s != ""
или len(s) == 0
? В чем разница между этими подходами?Оба способа корректны и часто используются в Go. Однако предпочтительнее использовать
s != ""
, так как это делает код более читаемым и сразу показывает, что s
— это строка. Использование
len(s) == 0
также работает, но это более универсальный способ, который подходит для проверки пустоты слайсов, мап и других типов данных, поэтому может быть менее очевидно, что s
— строка.❤18👍1
💬 Как
Функция
Если в JSON присутствуют несколько ключей, которые отличаются только регистром,
В приведённом ниже коде JSON содержит два ключа
Таким образом, при наличии нескольких ключей с одинаковым именем, но разным регистром,
json.Unmarshal
обрабатывает совпадения ключей в JSON при разном регистре, и какой результат будет при наличии нескольких ключей, отличающихся только регистром?Функция
json.Unmarshal
при декодировании JSON-сообщений в структуру Go сначала пытается найти точное совпадение ключа. Если точное совпадение не найдено, она принимает ключи, совпадающие с именем поля структуры без учёта регистра.Если в JSON присутствуют несколько ключей, которые отличаются только регистром,
json.Unmarshal
выберет последнее упомянутое значение с учётом регистра. Например, если в JSON имеются ключи "HTML"
и "html"
, то при декодировании в поле HTML
структуры будет записано значение из последнего из них.В приведённом ниже коде JSON содержит два ключа
"HTML"
и "html"
с разными значениями, но функция Unmarshal
записывает значение из последнего ключа ("bar"
) в поле HTML
структуры:package main
import (
"encoding/json"
"fmt"
)
type T struct {
HTML string `json:"HTML"`
}
var s = `{"HTML": "foo", "html": "bar"}`
func main() {
var t T
if err := json.Unmarshal([]byte(s), &t); err != nil {
fmt.Println(err)
return
}
fmt.Println(t.HTML) // bar
}
Таким образом, при наличии нескольких ключей с одинаковым именем, но разным регистром,
json.Unmarshal
предпочтёт последнее значение.GitHub
encoding/json: parser ignores the case of member names · Issue #14750 · golang/go
What version of Go are you using? 5.3 What operating system and processor architecture are you using? amd64,windows What did you do? Read this: https://mailarchive.ietf.org/arch/msg/json/Ju-bwuRv-b...
👍16❤1🥰1
Самые полезные каналы для программистов в одной подборке!
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
Азбука айтишника — здесь мы познаем азы из мира программирования
🤖Про нейросети
Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей
Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка
Библиотека нейротекста | ChatGPT, Gemini, Bing
Библиотека нейровидео | Sora AI, Runway ML, дипфейки
Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion
#️⃣C#
Книги для шарпистов | C#, .NET, F#
Библиотека шарписта — полезные статьи, новости и обучающие материалы по C#
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel
☁️DevOps
Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
🐘PHP
Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты
🐍Python
Библиотека питониста — полезные статьи, новости и обучающие материалы по Python
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты
☕Java
Книги для джавистов | Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков
👾Data Science
Книги для дата сайентистов | Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту
🦫Go
Книги для Go разработчиков
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go
🧠C++
Книги для C/C++ разработчиков
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++
💻Другие каналы
Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Библиотека разработчика игр | Gamedev, Unity, Unreal Engine
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности
📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈
Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT
Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *
* Организация Meta запрещена на территории РФ
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
Азбука айтишника — здесь мы познаем азы из мира программирования
🤖Про нейросети
Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей
Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка
Библиотека нейротекста | ChatGPT, Gemini, Bing
Библиотека нейровидео | Sora AI, Runway ML, дипфейки
Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion
#️⃣C#
Книги для шарпистов | C#, .NET, F#
Библиотека шарписта — полезные статьи, новости и обучающие материалы по C#
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel
☁️DevOps
Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
🐘PHP
Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты
🐍Python
Библиотека питониста — полезные статьи, новости и обучающие материалы по Python
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты
☕Java
Книги для джавистов | Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков
👾Data Science
Книги для дата сайентистов | Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту
🦫Go
Книги для Go разработчиков
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go
🧠C++
Книги для C/C++ разработчиков
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++
💻Другие каналы
Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Библиотека разработчика игр | Gamedev, Unity, Unreal Engine
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности
📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈
Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT
Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *
* Организация Meta запрещена на территории РФ
💬 Как интерфейс
Интерфейс
🔸 Если источник реализует
🔸 Если получатель реализует
🔸 Если ни один из интерфейсов не реализован, используется внутренний буфер (по умолчанию 32 КБ).
Этот механизм позволяет сократить количество операций копирования и ускорить передачу данных, особенно для оптимизированных системных вызовов, таких как
io.WriterTo
оптимизирует передачу данных в Go и как io.Copy()
решает, какой метод использовать?Интерфейс
io.WriterTo
позволяет объекту-источнику напрямую записывать данные в объект-получатель через метод WriteTo(w Writer)
. Это устраняет необходимость промежуточного буфера, делая передачу данных более эффективной.io.Copy()
проверяет, реализует ли объект-источник интерфейс WriterTo
или объект-получатель интерфейс ReaderFrom
:🔸 Если источник реализует
WriterTo
, вызывается WriteTo()
.🔸 Если получатель реализует
ReaderFrom
, вызывается ReadFrom()
.🔸 Если ни один из интерфейсов не реализован, используется внутренний буфер (по умолчанию 32 КБ).
Этот механизм позволяет сократить количество операций копирования и ускорить передачу данных, особенно для оптимизированных системных вызовов, таких как
sendfile
в Linux.👍10
💬 Почему для генерации ключей в Go нельзя использовать
1. Без явного вызова
2. Если использовать
3.
math/rand
, и как правильно сгенерировать безопасный ключ?1. Без явного вызова
rand.Seed()
генератор math/rand
всегда возвращает одну и ту же последовательность чисел.2. Если использовать
time.Now().UnixNano()
как seed, доступно всего несколько бит энтропии, что делает последовательности легко предсказуемыми.3.
math/rand
не подходит для криптографических задач, так как его алгоритм детерминированный и может быть взломан.crypto/rand Reader
— альтернативный вараинт , а если нам нужен текст, можно вывести его в шестнадцатеричном формате или в формате base64
:import (
"crypto/rand"
// "encoding/base64"
// "encoding/hex"
"fmt"
)
func Key() string {
buf := make([]byte, 16)
_, err := rand.Read(buf)
if err != nil {
panic(err) // out of randomness, should never happen
}
return fmt.Sprintf("%x", buf)
// or hex.EncodeToString(buf)
// or base64.StdEncoding.EncodeToString(buf)
}
👍22❤3
💬 Какой подход лучше использовать для объявления пустого среза в Go и почему?
Предпочтительнее использовать
Важно учитывать, что есть ситуации, когда предпочтителен не-nil срез с нулевой длиной. Например, при кодировании JSON: nil-срез кодируется как null, а
Предпочтительнее использовать
var t []string
вместо t := []string{}
. Первый вариант объявляет срез как nil, в то время как второй вариант создаёт не-nil срез нулевой длины. Они функционально эквивалентны — их len и cap равны нулю, — но стиль с nil-срезом считается предпочтительным.Важно учитывать, что есть ситуации, когда предпочтителен не-nil срез с нулевой длиной. Например, при кодировании JSON: nil-срез кодируется как null, а
[]string{}
— как пустой JSON-массив []
.👍17
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
👍1
💬 Почему копирование структур в Go может привести к неожиданным результатам? Приведите пример.
Копирование структур может быть проблематичным, если структура содержит указатели или срезы, которые при копировании продолжают ссылаться на ту же область памяти, что и оригинал. Например, структура
В этом примере срез
Копирование структур может быть проблематичным, если структура содержит указатели или срезы, которые при копировании продолжают ссылаться на ту же область памяти, что и оригинал. Например, структура
bytes.Buffer
содержит срез []byte
. Если скопировать объект Buffer
, методы, вызванные на копии, могут изменять данные в оригинале, так как оба объекта используют одну и ту же память.package main
import (
"bytes"
"fmt"
)
func main() {
// Создаем оригинальный буфер
original := bytes.Buffer{}
original.WriteString("Hello")
// Копируем буфер
copyBuffer := original
// Добавляем данные в копию
copyBuffer.WriteString(", World!")
// Проверяем содержимое оригинала
fmt.Println(original.String()) // Вывод: "Hello, World!"
}
В этом примере срез
[]byte
в копии copyBuffer
ссылается на тот же массив, что и в оригинале original
. Поэтому изменения в одном буфере затрагивают другой.👍13
Forwarded from Библиотека Go-разработчика | Golang
🦫 Самоучитель по Go для начинающих. Часть 17. Основы сетевого программирования. Стек TCP/IP. Сокеты. Пакет net
В этой части самоучителя мы погрузимся в мир сетевого программирования, изучим его основные концепции и инструменты. Начнем с рассмотрения принципов работы компьютерных сетей и их архитектуры, познакомимся с протоколами TCP и IP, лежащими в основе стека TCP/IP.
Затем детально изучим сокеты и их роль в сетевом взаимодействии. Особое внимание будет уделено пакету net, который предоставляет удобные инструменты для реализации сетевых приложений.
👉 Читать гайд
👩💻 Остальные части в серии:
1. Особенности и сфера применения Go, установка, настройка
2. Ресурсы для изучения Go с нуля
3. Организация кода. Пакеты, импорты, модули. Ввод-вывод текста.
4. Переменные. Типы данных и их преобразования. Основные операторы
5. Условные конструкции if-else и switch-case. Цикл for. Вложенные и бесконечные циклы
6. Функции и аргументы. Области видимости. Рекурсия. Defer
7. Массивы и слайсы. Append и сopy. Пакет slices
8. Строки, руны, байты. Пакет strings. Хеш-таблица (map)
9. Структуры и методы. Интерфейсы. Указатели. Основы ООП
10. Введение в ООП. Наследование, абстракция, полиморфизм, инкапсуляция
11. Обработка ошибок. Паника. Восстановление. Логирование
12. Обобщенное программирование. Дженерики
13. Работа с датой и временем. Пакет time
14. Интерфейсы ввода-вывода. Буферизация. Работа с файлами. Пакеты io, bufio, os
15. Конкурентность. Горутины. Каналы
16. Тестирование кода и его виды. Table-driven подход. Параллельные тесты
В этой части самоучителя мы погрузимся в мир сетевого программирования, изучим его основные концепции и инструменты. Начнем с рассмотрения принципов работы компьютерных сетей и их архитектуры, познакомимся с протоколами TCP и IP, лежащими в основе стека TCP/IP.
Затем детально изучим сокеты и их роль в сетевом взаимодействии. Особое внимание будет уделено пакету net, который предоставляет удобные инструменты для реализации сетевых приложений.
1. Особенности и сфера применения Go, установка, настройка
2. Ресурсы для изучения Go с нуля
3. Организация кода. Пакеты, импорты, модули. Ввод-вывод текста.
4. Переменные. Типы данных и их преобразования. Основные операторы
5. Условные конструкции if-else и switch-case. Цикл for. Вложенные и бесконечные циклы
6. Функции и аргументы. Области видимости. Рекурсия. Defer
7. Массивы и слайсы. Append и сopy. Пакет slices
8. Строки, руны, байты. Пакет strings. Хеш-таблица (map)
9. Структуры и методы. Интерфейсы. Указатели. Основы ООП
10. Введение в ООП. Наследование, абстракция, полиморфизм, инкапсуляция
11. Обработка ошибок. Паника. Восстановление. Логирование
12. Обобщенное программирование. Дженерики
13. Работа с датой и временем. Пакет time
14. Интерфейсы ввода-вывода. Буферизация. Работа с файлами. Пакеты io, bufio, os
15. Конкурентность. Горутины. Каналы
16. Тестирование кода и его виды. Table-driven подход. Параллельные тесты
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
👨💻🚀 Тест: насколько ты продвинутый разраб?
Говорят, что джун становится мидлом, когда начинает понимать, как мало он знает. Этот тест покажет, насколько ты продвинулся в своём развитии.
👉 Ворваться
Говорят, что джун становится мидлом, когда начинает понимать, как мало он знает. Этот тест покажет, насколько ты продвинулся в своём развитии.
👉 Ворваться
🤩1
💬 Почему добавление элементов в nil-срез работает, а добавление в nil-мапу вызывает панику?
В Go срезы и тип map работают по-разному:
1. Срезы:
🔸
🔸 Когда мы вызываем
Пример:
2. Тип map
🔸
🔸 Любая попытка добавить элемент в
🔸 Для работы с мапой её нужно явно инициализировать с помощью функции
Пример:
В Go срезы и тип map работают по-разному:
1. Срезы:
🔸
nil
-срез — это валидный срез с нулевой длиной (len == 0
) и нулевой ёмкостью (cap == 0
).🔸 Когда мы вызываем
append()
на nil
-срезе, Go выделяет новую память и создаёт срез с достаточной ёмкостью для хранения новых элементов. Поэтому добавление элементов в nil
-срез работает без ошибок.Пример:
var a []int
a = append(a, 4, 5, 6) // Создаётся новый срез в памяти
fmt.Println(a) // [4 5 6]
2. Тип map
🔸
nil
-мапа неинициализирована и не имеет памяти для хранения пар ключ-значение.🔸 Любая попытка добавить элемент в
nil
-мапу вызовет панику, так как мапа не готова к использованию.🔸 Для работы с мапой её нужно явно инициализировать с помощью функции
make
.Пример:
var m map[int]int
// m[1] = 1 // Вызовет панику
m = make(map[int]int)
m[1] = 1 // Теперь работает
👍14❤2
❓Как избежать состояния гонки?
✅Используйте мьютексы (sync.Mutex):
Мьютекс блокирует доступ к ресурсу, пока горутина не освободит его.
Пример:
✅Используйте каналы для синхронизации:
Каналы позволяют передавать данные между горутинами, избегая прямого доступа к разделяемой памяти.
Пример:
✅Используйте атомарные операции (sync/atomic):
Для операций инкремента, декремента и чтения/записи целых чисел используйте пакет sync/atomic.
Пример:
✅Минимизируйте разделяемое состояние:
Старайтесь проектировать программу так, чтобы каждая горутина работала с собственными данными. Это снижает вероятность состояния гонки.
Используйте инструменты для обнаружения состояния гонки:
✅ Go предоставляет встроенный инструмент -race для выявления состояния гонки.
Пример запуска:
✅ Понимайте порядок работы горутин:
Горутины не гарантируют порядок выполнения. Используйте механизмы синхронизации (sync.WaitGroup, каналы) для управления их завершением.
✅Используйте мьютексы (sync.Mutex):
Мьютекс блокирует доступ к ресурсу, пока горутина не освободит его.
Пример:
gopackage main
import (
«fmt»
«sync»
)
var counter int
var mu sync.Mutex
func increment(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 1000; i++ {
mu.Lock() // Блокируем доступ
counter++
mu.Unlock() // Освобождаем доступ
}
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go increment(&wg)
go increment(&wg)
wg.Wait()
fmt.Println(«Counter:», counter) // Правильное значение}
✅Используйте каналы для синхронизации:
Каналы позволяют передавать данные между горутинами, избегая прямого доступа к разделяемой памяти.
Пример:
gopackage main
import «fmt»
func main() {
ch := make(chan int)
go func() {
sum := 0
for i := 0; i < 1000; i++ {
sum++
}
ch <- sum
}()
result := <-ch
fmt.Println(«Result:», result) // Гарантированно корректное значение}
✅Используйте атомарные операции (sync/atomic):
Для операций инкремента, декремента и чтения/записи целых чисел используйте пакет sync/atomic.
Пример:
gopackage main
import ( «fmt» «sync» «sync/atomic»)
var counter int64
func increment(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 1000; i++ {
atomic.AddInt64(&counter, 1) // Атомарное увеличение
}
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go increment(&wg)
go increment(&wg)
wg.Wait()
fmt.Println(«Counter:», counter) // Корректное значение}
✅Минимизируйте разделяемое состояние:
Старайтесь проектировать программу так, чтобы каждая горутина работала с собственными данными. Это снижает вероятность состояния гонки.
Используйте инструменты для обнаружения состояния гонки:
✅ Go предоставляет встроенный инструмент -race для выявления состояния гонки.
Пример запуска:
go run -race main.go
✅ Понимайте порядок работы горутин:
Горутины не гарантируют порядок выполнения. Используйте механизмы синхронизации (sync.WaitGroup, каналы) для управления их завершением.
👍11
Черные скидки на курсы в Академии!
-40% до конца ноября
🔥 В честь Черной пятницы до 30 ноября запускаем распродажу на все курсы proglib.academy и дарим промокод на сумму 10 000 на технику в магазине DigitalRazor (отправим вам по запросу)
🎁 Анонс новогоднего сюрприза!
🎄 Те, кто успеет приобрести курсы с 27 ноября по 27 декабря, получат шанс выиграть крутой новогодний подарок.
Что это будет, пока держим в секрете – следите за новостями на нашем канале!
Почему стоит выбрать нас?
⚫️ Опытные преподаватели
Вас будут обучать доценты ВМК МГУ по математике, а алгоритмы расскажет разработчик из Яндекса и преподаватель МФТИ и НИУ ВШЭ.
⚫️ Бессрочный доступ ко всем курсам
Проходите обучение в удобном для вас темпе, без давления жестких сроков.
⚫️ Поддержка преподавателей
Не останетесь одни — вам всегда помогут разобраться с трудными темами и ответят на любые вопросы через чат и платформу Coreapp.
👉 Не уверены, подойдет ли вам курс? Начните с бесплатных вводных занятий и познакомьтесь с преподавателями и форматом обучения –
Ждем вас на обучении! 🙌
-40% до конца ноября
🔥 В честь Черной пятницы до 30 ноября запускаем распродажу на все курсы proglib.academy и дарим промокод на сумму 10 000 на технику в магазине DigitalRazor (отправим вам по запросу)
🎁 Анонс новогоднего сюрприза!
🎄 Те, кто успеет приобрести курсы с 27 ноября по 27 декабря, получат шанс выиграть крутой новогодний подарок.
Что это будет, пока держим в секрете – следите за новостями на нашем канале!
Почему стоит выбрать нас?
⚫️ Опытные преподаватели
Вас будут обучать доценты ВМК МГУ по математике, а алгоритмы расскажет разработчик из Яндекса и преподаватель МФТИ и НИУ ВШЭ.
⚫️ Бессрочный доступ ко всем курсам
Проходите обучение в удобном для вас темпе, без давления жестких сроков.
⚫️ Поддержка преподавателей
Не останетесь одни — вам всегда помогут разобраться с трудными темами и ответят на любые вопросы через чат и платформу Coreapp.
👉 Не уверены, подойдет ли вам курс? Начните с бесплатных вводных занятий и познакомьтесь с преподавателями и форматом обучения –
Ждем вас на обучении! 🙌
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Лучшие ресурсы, чтобы не отставать от трендов из мира Go.
👣 Golang Go - авторский канал, посвященный Go разработке, Devops и созданию высоконагруженных сервисов.
📚 Golang books — редкая литература , статьи, курсы и уникальные гайды для Golang специалистов любого уровня. Читайте, развивайтесь, практикуйте.
💼 Golang Jobs — актуальные предложения для Golang разработчиков от самых крупных работодателей и лидеров рынка.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🥰2🤩2
❓ Как используется оператор select в Go?
✅ Оператор select в Go используется для работы с несколькими каналами одновременно. Это позволяет горутине ожидать события на нескольких каналах и блокировать выполнение до тех пор, пока не произойдёт одно из событий (например, получение данных с канала).
🛠 select работает подобно конструкции switch, но вместо проверки значений переменных, она проверяет операции с каналами. Когда одна из операций с каналом завершается, выполняется соответствующий блок кода.
✅ Оператор select в Go используется для работы с несколькими каналами одновременно. Это позволяет горутине ожидать события на нескольких каналах и блокировать выполнение до тех пор, пока не произойдёт одно из событий (например, получение данных с канала).
🛠 select работает подобно конструкции switch, но вместо проверки значений переменных, она проверяет операции с каналами. Когда одна из операций с каналом завершается, выполняется соответствующий блок кода.
🔥6👍5
This media is not supported in your browser
VIEW IN TELEGRAM
⚡️ Напоминаем: у нас можно (и нужно) купить рекламу
→ Более 60 телеграм-каналов по всем направлениям IT
→ Почти 1,2 миллиона аудитории
→ Собственное медиа и сайт с DAU 25 000 — можем усилить продвижение
→ Классные email-рассылки
→ И, конечно же, крутые контент-менеджеры, которые сделают нативную интеграцию/придумают виральный пост/реализуют любые контентные предпочтения
Для заказа пишите сюда: @proglib_adv
→ Более 60 телеграм-каналов по всем направлениям IT
→ Почти 1,2 миллиона аудитории
→ Собственное медиа и сайт с DAU 25 000 — можем усилить продвижение
→ Классные email-рассылки
→ И, конечно же, крутые контент-менеджеры, которые сделают нативную интеграцию/придумают виральный пост/реализуют любые контентные предпочтения
Для заказа пишите сюда: @proglib_adv
👍1
❓ Как форматировать исходный код на Go идиоматично?
Идиоматичный Go-код — это код, написанный в соответствии с общепринятыми стилевыми и архитектурными стандартами языка Go, отражающий лучшие практики и философию языка.
🎯 Идиоматичное форматирование Go-кода достигается с помощью встроенного инструмента gofmt, который автоматически приводит код к стандартному стилю, обеспечивая консистентность отступов и пробелов. Рекомендуется использовать goimports для управления импортами, автоматически добавляя или удаляя их по необходимости. Интеграция этих инструментов в редакторы кода, такие как VS Code или GoLand, позволяет автоматически форматировать код при сохранении.
Идиоматичный Go-код — это код, написанный в соответствии с общепринятыми стилевыми и архитектурными стандартами языка Go, отражающий лучшие практики и философию языка.
🎯 Идиоматичное форматирование Go-кода достигается с помощью встроенного инструмента gofmt, который автоматически приводит код к стандартному стилю, обеспечивая консистентность отступов и пробелов. Рекомендуется использовать goimports для управления импортами, автоматически добавляя или удаляя их по необходимости. Интеграция этих инструментов в редакторы кода, такие как VS Code или GoLand, позволяет автоматически форматировать код при сохранении.
🥱7👏4👍1😢1