💬 Для чего можно использовать тег структуры json:"-" в Go?
Данный тег можно использовать для того, чтобы игнорировать поле структуры при сериализации в JSON (маршализации).
Это означает, что данное поле не будет включено в итоговый JSON-объект при его создании. Простой пример представлен выше.
Данный тег можно использовать для того, чтобы игнорировать поле структуры при сериализации в JSON (маршализации).
Это означает, что данное поле не будет включено в итоговый JSON-объект при его создании. Простой пример представлен выше.
👍11
Самые полезные каналы для программистов в одной подборке!
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
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 запрещена на территории РФ
👍2❤1
💬 Чем версия Go отличается от Go toolchain?
Версия Go — это номер версии языка программирования Go, который указывает на конкретный релиз языка и его стандартной библиотеки. Версия Go определяет синтаксис языка, доступные стандартные библиотеки, и базовые инструменты, входящие в комплект поставки языка.
Go Toolchain — это набор инструментов, предоставляемый с Go, который включает в себя компилятор (
Версия Go — это номер версии языка программирования Go, который указывает на конкретный релиз языка и его стандартной библиотеки. Версия Go определяет синтаксис языка, доступные стандартные библиотеки, и базовые инструменты, входящие в комплект поставки языка.
Go Toolchain — это набор инструментов, предоставляемый с Go, который включает в себя компилятор (
go build
), менеджер пакетов (go mod
), инструмент тестирования (go test
), анализатор кода (go vet
) и другие утилиты, необходимые для разработки, сборки и отладки Go программ. Go toolchain обновляется с каждым новым релизом Go, и его версия соответствует версии языка Go.❤7
Приглашенный спикер: Павел Запольский – Senior Quantitative Researcher at Exness и Co-founder GrowLytics. Запустивший более 10 проектов по машинному обучению и анализу данных для ведущих компаний.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👾1
💬 Для чего предназначена переменная окружения GOEXPERIMENT?
Она позволяет включать экспериментальные функции и возможности в компиляторе, runtime или стандартной библиотеке Go. Эти функции обычно находятся в процессе разработки или тестирования и могут не быть включены в финальный релиз, но доступны для тестирования разработчиками.
📌 Например, Go 1.23 добавляет экспериментальную функцию: generic type aliases. Активировать ее можно с помощью добавления переменной окружения
Она позволяет включать экспериментальные функции и возможности в компиляторе, runtime или стандартной библиотеке Go. Эти функции обычно находятся в процессе разработки или тестирования и могут не быть включены в финальный релиз, но доступны для тестирования разработчиками.
📌 Например, Go 1.23 добавляет экспериментальную функцию: generic type aliases. Активировать ее можно с помощью добавления переменной окружения
GOEXPERIMENT=aliastypeparams
.
type G[A any, B ~bool, C comparable] = struct {
a A
b B
c C
}
👍4
💬 В чем разница между переменными окружения GOPATH и GOROOT?
• GOROOT — это путь к установленной версии Go и его инструментам.
• GOPATH — это рабочее пространство, где хранятся наши проекты и их зависимости.
В реальных проектах, с появлением модулей в Go 1.11, GOPATH стала менее критичной, но все еще имеет значение для некоторых аспектов разработки и сборки приложений.
• GOROOT — это путь к установленной версии Go и его инструментам.
• GOPATH — это рабочее пространство, где хранятся наши проекты и их зависимости.
В реальных проектах, с появлением модулей в Go 1.11, GOPATH стала менее критичной, но все еще имеет значение для некоторых аспектов разработки и сборки приложений.
👍9
Forwarded from Библиотека программиста | программирование, кодинг, разработка
📶 Паттерны коммуникации в распределенных системах
Распределенные системы состоят из многих отдельных частей/узлов, работающих вместе, но физически расположенных в разных местах. Эти части системы должны общаться друг с другом через сеть, чтобы система могла функционировать как единое целое.
Хотя коммуникация критически важна, правильно ее организовать бывает непросто: разработчики иногда пытаются использовать один и тот же подход ко всем задачам коммуникации, что может быть неэффективно. Важно понимать, что существуют разные способы организации коммуникации, и выбор правильного метода зависит от конкретной задачи. Рассмотрим основные паттерны коммуникации, которые можно использовать для решения разных задач.
☑️ Запрос-ответ с HTTP
Этот синхронный паттерн коммуникации предполагает, что один сервис отправляет запрос другому сервису и ожидает ответа или ошибки, блокируя свою работу до получения результата. REST, наиболее популярный архитектурный стиль для этой модели коммуникации, использует методы протокола HTTP — GET, POST, PUT и DELETE.
Однако использование этого паттерна может привести к проблемам, если сервисы образуют цепочку взаимодействий: в таком случае сбой одного из сервисов может привести к отказу всей операции, а также к расточительному использованию ресурсов и каскадным сбоям.
☑️ Общие данные
Этот паттерн часто остается незамеченным, поскольку разработчики не всегда воспринимают его как модель коммуникации. В рамках этого подхода один компонент записывает данные в определенное место, а другой компонент считывает и обрабатывает эти данные. Например, один сервис может загрузить файл в облачное объектное хранилище (например, в корзину Amazon S3), а другой сервис затем извлекает этот файл для дальнейших действий.
Главное преимущество этого паттерна — простота реализации и возможность обеспечения взаимодействия между устаревшими и современными системами без проблем совместимости. Однако он не подходит для сценариев, требующих низкой задержки.
☑️ Асинхронный запрос-ответ
В отличие от синхронного подхода, запрос-ответ может быть реализован асинхронно и без блокировки. В этом случае получающий сервис должен явно знать место назначения для отправки ответа. Для реализации этого паттерна идеально подходят очереди сообщений, которые позволяют буферизовать несколько запросов.
Основная сложность здесь — корреляция между запросом и ответом: экземпляр сервиса, отправивший запрос, может отличаться от экземпляра, получающего ответ, поэтому требуется способ отслеживания запросов.
☑️ Коммуникация на основе событий
В этом подходе сервисы не общаются напрямую друг с другом, а генерируют события, которые могут быть использованы другими сервисами. Это требует наличия места для отправки данных о событиях и механизма, позволяющего получающим сервисам обнаруживать эти события. Брокеры сообщений, такие как RabbitMQ, могут обрабатывать оба этих аспекта. Издатели используют API для отправки событий в брокер, который управляет подписками и уведомляет подписчиков при поступлении события.
Этот паттерн идеально подходит для создания слабосвязанных взаимодействий между сервисами. Однако брокер сообщений должен обеспечивать надежную доставку событий, их упорядочивание и согласованность. Кроме того, добавляется дополнительный компонент в систему.
👨💻 Подробнее читайте в статье.
📨 Материал взят из нашей еженедельной email-рассылки, посвященной бэкенду. Подпишитесь, чтобы быть в числе первых, кто получит дайджест.
Распределенные системы состоят из многих отдельных частей/узлов, работающих вместе, но физически расположенных в разных местах. Эти части системы должны общаться друг с другом через сеть, чтобы система могла функционировать как единое целое.
Хотя коммуникация критически важна, правильно ее организовать бывает непросто: разработчики иногда пытаются использовать один и тот же подход ко всем задачам коммуникации, что может быть неэффективно. Важно понимать, что существуют разные способы организации коммуникации, и выбор правильного метода зависит от конкретной задачи. Рассмотрим основные паттерны коммуникации, которые можно использовать для решения разных задач.
☑️ Запрос-ответ с HTTP
Этот синхронный паттерн коммуникации предполагает, что один сервис отправляет запрос другому сервису и ожидает ответа или ошибки, блокируя свою работу до получения результата. REST, наиболее популярный архитектурный стиль для этой модели коммуникации, использует методы протокола HTTP — GET, POST, PUT и DELETE.
Однако использование этого паттерна может привести к проблемам, если сервисы образуют цепочку взаимодействий: в таком случае сбой одного из сервисов может привести к отказу всей операции, а также к расточительному использованию ресурсов и каскадным сбоям.
☑️ Общие данные
Этот паттерн часто остается незамеченным, поскольку разработчики не всегда воспринимают его как модель коммуникации. В рамках этого подхода один компонент записывает данные в определенное место, а другой компонент считывает и обрабатывает эти данные. Например, один сервис может загрузить файл в облачное объектное хранилище (например, в корзину Amazon S3), а другой сервис затем извлекает этот файл для дальнейших действий.
Главное преимущество этого паттерна — простота реализации и возможность обеспечения взаимодействия между устаревшими и современными системами без проблем совместимости. Однако он не подходит для сценариев, требующих низкой задержки.
☑️ Асинхронный запрос-ответ
В отличие от синхронного подхода, запрос-ответ может быть реализован асинхронно и без блокировки. В этом случае получающий сервис должен явно знать место назначения для отправки ответа. Для реализации этого паттерна идеально подходят очереди сообщений, которые позволяют буферизовать несколько запросов.
Основная сложность здесь — корреляция между запросом и ответом: экземпляр сервиса, отправивший запрос, может отличаться от экземпляра, получающего ответ, поэтому требуется способ отслеживания запросов.
☑️ Коммуникация на основе событий
В этом подходе сервисы не общаются напрямую друг с другом, а генерируют события, которые могут быть использованы другими сервисами. Это требует наличия места для отправки данных о событиях и механизма, позволяющего получающим сервисам обнаруживать эти события. Брокеры сообщений, такие как RabbitMQ, могут обрабатывать оба этих аспекта. Издатели используют API для отправки событий в брокер, который управляет подписками и уведомляет подписчиков при поступлении события.
Этот паттерн идеально подходит для создания слабосвязанных взаимодействий между сервисами. Однако брокер сообщений должен обеспечивать надежную доставку событий, их упорядочивание и согласованность. Кроме того, добавляется дополнительный компонент в систему.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
💬 Как работает go mod vendor?
Когда мы работаем с модулями в Go, компилятор обычно извлекает все необходимые модули из их онлайн-источников или репозиториев и сохраняет в локальном кэше. Расположение:
Этот кэш — это просто место на хост-машине, где Go хранит копии всех загруженных модулей. Поэтому, когда мы собираем проект с помощью
Простыми словами,
👉 Подробнее
Когда мы работаем с модулями в Go, компилятор обычно извлекает все необходимые модули из их онлайн-источников или репозиториев и сохраняет в локальном кэше. Расположение:
$GOPATH/pkg/mod
или
$ go env GOMODCACHE
Этот кэш — это просто место на хост-машине, где Go хранит копии всех загруженных модулей. Поэтому, когда мы собираем проект с помощью
go build
или тестируем его с помощью go test
, Go использует эти кэшированные копии для поиска и загрузки необходимых пакетов.Простыми словами,
go mod vendor
копирует все зависимости проекта в директорию vendor
, чтобы обеспечить изоляцию, стабильность сборки и возможность сборки без доступа к сети.Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
💬 Зачем нужна observability (наблюдаемость)?
Наблюдаемость — это естественная эволюция традиционного мониторинга, обусловленная новыми сложностями, возникающими в облачных архитектурах.
Первая из них — огромный масштаб многих современных облачных систем, содержащих слишком много данных. Все данные, генерируемые несколькими взаимосвязанными системами, работающими одновременно, предоставляют больше сведений, чем мы можем осознать, больше данных, чем мы можем воспринять, и больше взаимосвязей, чем мы можем разобрать.
Но особенно важно то, что природа облачных систем коренным образом отличается от более традиционных архитектур, существовавших не так давно. Их контекстные и функциональные требования различны, они по- разному функционируют и терпят неудачу, и гарантии, которые они должны предоставлять, тоже различны.
Как организовать мониторинг распределенных систем, учитывая эфемерность современных приложений и окружений, в которых они находятся? Как выявить дефект в отдельном компоненте в сложной распределенной системе? Эти задачи и пытается решить «наблюдаемость».
Наблюдаемость — это естественная эволюция традиционного мониторинга, обусловленная новыми сложностями, возникающими в облачных архитектурах.
Первая из них — огромный масштаб многих современных облачных систем, содержащих слишком много данных. Все данные, генерируемые несколькими взаимосвязанными системами, работающими одновременно, предоставляют больше сведений, чем мы можем осознать, больше данных, чем мы можем воспринять, и больше взаимосвязей, чем мы можем разобрать.
Но особенно важно то, что природа облачных систем коренным образом отличается от более традиционных архитектур, существовавших не так давно. Их контекстные и функциональные требования различны, они по- разному функционируют и терпят неудачу, и гарантии, которые они должны предоставлять, тоже различны.
Как организовать мониторинг распределенных систем, учитывая эфемерность современных приложений и окружений, в которых они находятся? Как выявить дефект в отдельном компоненте в сложной распределенной системе? Эти задачи и пытается решить «наблюдаемость».
👍8🔥2
Forwarded from Библиотека Go-разработчика | Golang
🏃 Самоучитель по Go для начинающих. Часть 15. Конкурентность. Горутины. Каналы
В 15-й части самоучителя мы разберем работу базовых сущностей ОС для погружения в парадигму конкурентного программирования, а затем изучим основные способы её реализации в Go с помощью горутин и каналов.
👉 Читать гайд
📌 Остальные части в серии:
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-й части самоучителя мы разберем работу базовых сущностей ОС для погружения в парадигму конкурентного программирования, а затем изучим основные способы её реализации в Go с помощью горутин и каналов.
👉 Читать гайд
📌 Остальные части в серии:
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
👍4
💬 Зачем для подсчета времени в Go использовать тип данных int32, если он содержит отрицательные значения?
Отрицательными целыми числами представляется время до эпохи UNIX, а положительными — после неё. Таким образом, значение счетчика -100 означает момент времени за 100 секунд до полуночи 1 января 1970 года, а +100 секунд указывает на 100 секунд после этой даты.
Отрицательными целыми числами представляется время до эпохи UNIX, а положительными — после неё. Таким образом, значение счетчика -100 означает момент времени за 100 секунд до полуночи 1 января 1970 года, а +100 секунд указывает на 100 секунд после этой даты.
Wikipedia
Unix-время
Система описания моментов во времени
👍21
Forwarded from Библиотека Go-разработчика | Golang
Текстовая версия выступления Ian Lance Taylor на GopherCon 2024 о том, почему эта фича была добавлена, что из себя представляет и как ее использовать.
👉 Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
go.dev
Range Over Function Types - The Go Programming Language
A description of range over function types, a new feature in Go 1.23.
👍3
💬 Что из себя представляет проблема false sharing?
Если у двух строк кэша общие адреса, процессор помечает их как общие (shared). Если один поток изменяет общую строку, он помечает обе как измененные (modified).
Чтобы гарантировать когерентность кэшей, требуется координация между ядрами, что может значительно снизить производительность приложения. Эта проблема называется false sharing (ложный обмен информацией).
Если у двух строк кэша общие адреса, процессор помечает их как общие (shared). Если один поток изменяет общую строку, он помечает обе как измененные (modified).
Чтобы гарантировать когерентность кэшей, требуется координация между ядрами, что может значительно снизить производительность приложения. Эта проблема называется false sharing (ложный обмен информацией).
👍4
Forwarded from Библиотека Go-разработчика | Golang
💡Кстати, стандартная библиотека Go включает в себя простой в использовании обратный прокси-сервер
👉 Документация
httputil.NewSingleHostReverseProxy
создает обратный прокси-сервер, который перезаписывает URL-адреса на указанный целевой хост.👉 Документация
👍6
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
💬 В чем суть модели PMG в Go?
PMG расшифровывается как P (логические процессоры), M (машинные потоки) и G (горутины). Основная идея заключается в том, что каждый логический процессор (P) может одновременно работать только с одним машинным потоком (M). А чтобы горутина (G) могла выполняться, она должна быть привязана к потоку (M).
Это сводится к двум ключевым моментам:
1. Если у нас есть
2. В любой момент времени только одна горутина (G) может выполняться на одном процессоре (P). Таким образом, когда P1 занят выполнением G, никакая другая G не может выполняться на этом P1, пока текущая G не будет заблокирована, не завершит выполнение или не произойдет что-то, что освободит этот процессор.
PMG расшифровывается как P (логические процессоры), M (машинные потоки) и G (горутины). Основная идея заключается в том, что каждый логический процессор (P) может одновременно работать только с одним машинным потоком (M). А чтобы горутина (G) могла выполняться, она должна быть привязана к потоку (M).
Это сводится к двум ключевым моментам:
1. Если у нас есть
n
логических процессоров (P), мы можем параллельно запускать до n
горутин, при условии, что у нас доступно как минимум n
машинных потоков (M).2. В любой момент времени только одна горутина (G) может выполняться на одном процессоре (P). Таким образом, когда P1 занят выполнением G, никакая другая G не может выполняться на этом P1, пока текущая G не будет заблокирована, не завершит выполнение или не произойдет что-то, что освободит этот процессор.
🔥18👍4
💬 Почему GOPATH режим был заменён Go модулями?
Основная причина заключается в том, что режим GOPATH не включает в себя понятие версий пакетов.
Режим GOPATH использует код, который у нас уже есть на машине, для сборки зависимостей. Это означает, что если мы клонируем проект и собираем его, мы можем получить другие зависимости, чем те, которые использовались изначально.
В отличие от этого, Go модули управляют зависимостями с использованием конкретных версий, что гарантирует, что все используют один и тот же код. Когда мы клонируем проект и загружаем его зависимости, Go модули проверяют эти зависимости с go.sum файлом, чтобы убедиться, что они такие же, как использовались изначально.
Основная причина заключается в том, что режим GOPATH не включает в себя понятие версий пакетов.
Режим GOPATH использует код, который у нас уже есть на машине, для сборки зависимостей. Это означает, что если мы клонируем проект и собираем его, мы можем получить другие зависимости, чем те, которые использовались изначально.
В отличие от этого, Go модули управляют зависимостями с использованием конкретных версий, что гарантирует, что все используют один и тот же код. Когда мы клонируем проект и загружаем его зависимости, Go модули проверяют эти зависимости с go.sum файлом, чтобы убедиться, что они такие же, как использовались изначально.
👍26
💬 Может ли адрес значения измениться во время выполнения Go-программы?
В стандартной реализации рантайма Go стек горутины может увеличиваться или уменьшаться по мере необходимости во время выполнения программы. Это означает, что адрес значения, размещенного на стеке, изменится, если размер стека изменится.
Например, следующий код выведет два разных адреса:
В стандартной реализации рантайма Go стек горутины может увеличиваться или уменьшаться по мере необходимости во время выполнения программы. Это означает, что адрес значения, размещенного на стеке, изменится, если размер стека изменится.
Например, следующий код выведет два разных адреса:
package main
//go:noinline
func f(i int) byte {
var a [1 << 12]byte
return a[i]
}
func main() {
var x int
println(&x)
f(100) // увеличиваем стек
println(&x)
}
👍17