💬 Имеет ли значение порядок полей в структуре Go?
Да, порядок полей в структуре в Go имеет значение, особенно когда речь идет о выравнивании памяти и оптимизации использования памяти.
В Go, компилятор учитывает выравнивание памяти, чтобы обеспечить более эффективный доступ к данным и уменьшить объем занимаемой памяти.
📌 Несколько аспектов, по которым порядок полей может быть важен:
1. Каждый тип данных имеет требования к выравниванию, что значит, что данные этого типа должны начинаться с определенного адреса в памяти. Например, тип
2. Порядок полей может влиять на общий размер структуры из-за вышеупомянутых "дыр". Путем рационального упорядочивания полей можно минимизировать эти "дыры" и сделать размер структуры меньше.
3. Эффективное выравнивание памяти может улучшить производительность приложения, так как процессоры обращаются к выровненной памяти быстрее. Неправильное выравнивание может привести к дополнительным затратам циклов процессора для доступа к данным.
Да, порядок полей в структуре в Go имеет значение, особенно когда речь идет о выравнивании памяти и оптимизации использования памяти.
В Go, компилятор учитывает выравнивание памяти, чтобы обеспечить более эффективный доступ к данным и уменьшить объем занимаемой памяти.
📌 Несколько аспектов, по которым порядок полей может быть важен:
1. Каждый тип данных имеет требования к выравниванию, что значит, что данные этого типа должны начинаться с определенного адреса в памяти. Например, тип
int64
в Go обычно требует выравнивания по 8-байтной границе. Если поля в структуре расположены таким образом, что между полями образуются "дыры" из-за выравнивания, это может привести к неэффективному использованию памяти.2. Порядок полей может влиять на общий размер структуры из-за вышеупомянутых "дыр". Путем рационального упорядочивания полей можно минимизировать эти "дыры" и сделать размер структуры меньше.
3. Эффективное выравнивание памяти может улучшить производительность приложения, так как процессоры обращаются к выровненной памяти быстрее. Неправильное выравнивание может привести к дополнительным затратам циклов процессора для доступа к данным.
👍19🥱1
💬 Что из себя представляют термины "zombie" и "orphan" в контексте операционной системы Linux?
Они описывают два различных состояния процессов:
1. Zombie process (зомби-процесс) — процесс, который завершил свое выполнение, но все еще присутствует в системе в качестве записи в таблице процессов. Это происходит потому, что процесс завершился, но его родительский процесс еще не вызвал системный вызов
Пока родитель не вызовет
2. Orphan Process (процесс-сирота) — процесс, чей родительский процесс завершился, оставив процесс без непосредственного предка в системе. В Linux и других UNIX-подобных системах, когда родительский процесс завершается, все его «сиротские» дочерние процессы автоматически «усыновляются» процессом с PID 1, который обычно является процессом
Они описывают два различных состояния процессов:
1. Zombie process (зомби-процесс) — процесс, который завершил свое выполнение, но все еще присутствует в системе в качестве записи в таблице процессов. Это происходит потому, что процесс завершился, но его родительский процесс еще не вызвал системный вызов
wait()
, который "собирает" статус завершения процесса-потомка. Пока родитель не вызовет
wait()
, зомби-процесс будет оставаться в системе с освобожденными ресурсами, но сохранившейся записью в таблице процессов. Это состояние позволяет родителю получить информацию о статусе завершения процесса-потомка.2. Orphan Process (процесс-сирота) — процесс, чей родительский процесс завершился, оставив процесс без непосредственного предка в системе. В Linux и других UNIX-подобных системах, когда родительский процесс завершается, все его «сиротские» дочерние процессы автоматически «усыновляются» процессом с PID 1, который обычно является процессом
init
или его современной заменой, например, systemd
. Этот процесс становится новым родителем процессов-сирот и отвечает за их завершение и очистку ресурсов.👍22❤1
💬 Гарантирует ли порядок выполнения конструкция select-case в Go?
Конструкция
Это помогает предотвратить блокировку и гарантировать, что все горутины имеют равные шансы на выполнение.
Если ни один из кейсов не готов, программа будет ждать, пока хотя бы один кейс не станет доступен, если только не предоставлен кейс
Конструкция
select-case
в Go не гарантирует порядок выполнения своих веток. Если в нескольких кейсах операции готовы к выполнению одновременно, выбор конкретного кейса для выполнения происходит случайным образом. Это помогает предотвратить блокировку и гарантировать, что все горутины имеют равные шансы на выполнение.
Если ни один из кейсов не готов, программа будет ждать, пока хотя бы один кейс не станет доступен, если только не предоставлен кейс
default
, который выполняется немедленно, когда другие кейсы не готовы.👍6
Самые полезные каналы для программистов в одной подборке!
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
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++
💻Другие каналы
Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Вакансии по фронтенду, джаваскрипт, 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++
💻Другие каналы
Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности
📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈
Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT
Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *
* Организация Meta запрещена на территории РФ
❤2👍1
💬 Когда процесс может не реагировать на SIGKILL в Unix-подобных операционных системах, включая Linux?
Сигнал SIGKILL (`kill -9`) предназначен для немедленного принудительного завершения процесса и не может быть перехвачен или обработан программно, что обеспечивает его высокую надежность.
Однако существуют особые случаи, когда процесс может не реагировать на SIGKILL:
1. Зомби-процессы: если процесс уже завершил выполнение и находится в состоянии "зомби", он не будет реагировать на SIGKILL, так как фактически уже завершен и ждет очистки из таблицы процессов.
2. Процессы, ожидающие завершения ввода-вывода на уровне ядра: если процесс застрял в незавершенной операции ввода-вывода в ядре, SIGKILL может не остановить процесс до тех пор, пока системный вызов не вернется из ядра.
3. Процессы в непрерывном взаимодействии с аппаратным обеспечением: аналогично предыдущему пункту, если процесс находится в состоянии ожидания аппаратного события, которое не происходит, ядро может не суметь прервать эту блокировку, и процесс продолжит висеть.
4. Процесс является процессом init, не получающим от ОС сигналов, которые он не хочет обрабатывать. Процесс init может игнорировать SIGKILL, так как он является особым процессом, который отвечает за запуск и завершение других процессов.
Сигнал SIGKILL (`kill -9`) предназначен для немедленного принудительного завершения процесса и не может быть перехвачен или обработан программно, что обеспечивает его высокую надежность.
Однако существуют особые случаи, когда процесс может не реагировать на SIGKILL:
1. Зомби-процессы: если процесс уже завершил выполнение и находится в состоянии "зомби", он не будет реагировать на SIGKILL, так как фактически уже завершен и ждет очистки из таблицы процессов.
2. Процессы, ожидающие завершения ввода-вывода на уровне ядра: если процесс застрял в незавершенной операции ввода-вывода в ядре, SIGKILL может не остановить процесс до тех пор, пока системный вызов не вернется из ядра.
3. Процессы в непрерывном взаимодействии с аппаратным обеспечением: аналогично предыдущему пункту, если процесс находится в состоянии ожидания аппаратного события, которое не происходит, ядро может не суметь прервать эту блокировку, и процесс продолжит висеть.
4. Процесс является процессом init, не получающим от ОС сигналов, которые он не хочет обрабатывать. Процесс init может игнорировать SIGKILL, так как он является особым процессом, который отвечает за запуск и завершение других процессов.
👍7
💬 Что из себя представляет Pub/Sub модель обмена сообщениями?
Это архитектурный шаблон, используемый в распределённых системах для асинхронного обмена сообщениями между компонентами системы через посредника, известного как брокер сообщений.
🔹 Издатели отправляют сообщения в определённые каналы или темы, управляемые брокером. Они не имеют информации о подписчиках и их количестве, что позволяет легко добавлять новые источники данных без изменения общей системы.
🔹 Подписчики регистрируются для получения сообщений из одной или нескольких тем. Они получают сообщения автоматически от брокера, когда издатели отправляют данные в те темы, на которые они подписаны. Это позволяет им реагировать на новые данные в реальном времени.
🔹 Брокер действует как посредник между издателями и подписчиками, управляя подписками и обеспечивая доставку сообщений к подписчикам. Брокер обеспечивает децентрализацию, масштабируемость и устойчивость системы, отвечая за буферизацию сообщений, управление трафиком и обработку ошибок.
Это архитектурный шаблон, используемый в распределённых системах для асинхронного обмена сообщениями между компонентами системы через посредника, известного как брокер сообщений.
🔹 Издатели отправляют сообщения в определённые каналы или темы, управляемые брокером. Они не имеют информации о подписчиках и их количестве, что позволяет легко добавлять новые источники данных без изменения общей системы.
🔹 Подписчики регистрируются для получения сообщений из одной или нескольких тем. Они получают сообщения автоматически от брокера, когда издатели отправляют данные в те темы, на которые они подписаны. Это позволяет им реагировать на новые данные в реальном времени.
🔹 Брокер действует как посредник между издателями и подписчиками, управляя подписками и обеспечивая доставку сообщений к подписчикам. Брокер обеспечивает децентрализацию, масштабируемость и устойчивость системы, отвечая за буферизацию сообщений, управление трафиком и обработку ошибок.
❤9
Ответьте на 3 вопроса, чтобы получить вводные занятия к курсу «Алгоритмы и структуры данных»
🔥Получите вводные занятия, ответив на 3 вопроса – https://proglib.io/w/c2161ff4
На вводной части вас ждут:
1. Лекция «Производительность алгоритмов» от руководителя разработки Яндекс.Самокатов
2. Лекция «Итеративные сортировки и линейные сортировки» от аспирант департамента искусственного интеллекта ВШЭ
3. Практические задания после лекций
4. Ссылки на дополнительные материалы для самостоятельного изучения
⚡️ Переходите и начинайте учиться уже сегодня – https://proglib.io/w/c2161ff4
🔥Получите вводные занятия, ответив на 3 вопроса – https://proglib.io/w/c2161ff4
На вводной части вас ждут:
1. Лекция «Производительность алгоритмов» от руководителя разработки Яндекс.Самокатов
2. Лекция «Итеративные сортировки и линейные сортировки» от аспирант департамента искусственного интеллекта ВШЭ
3. Практические задания после лекций
4. Ссылки на дополнительные материалы для самостоятельного изучения
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔3🥱2
💬 Чем отличается hard link от symbolic link в Linux? Что будет с файлом, если удалить hard link или symlink?
🔹 Жёсткая ссылка — это дополнительное имя для существующего файла на диске. Она указывает на те же самые блоки данных на диске, что и оригинальный файл, и имеет тот же номер inode.
🔹 Жёсткая ссылка фактически не отличается от оригинального файла. Изменения, сделанные через жёсткую ссылку, будут отражаться в оригинальном файле, так как они оба указывают на одни и те же данные.
🔹 Удаление жёсткой ссылки не приводит к удалению данных файла, пока существует хотя бы одна ссылка (имя файла) указывающая на эти данные. Файл будет физически удалён с диска только тогда, когда последняя жёсткая ссылка на него будет удалена.
🔸 Символическая ссылка — это отдельный файл, который содержит путь к другому файлу или другой директории. В отличие от жёсткой ссылки, она имеет свой собственный inode и блоки данных, которые хранят этот путь.
🔸 Если оригинальный файл, на который указывает символическая ссылка, будет перемещён или удалён, ссылка «сломается» и больше не сможет обеспечить доступ к файлу, потому что она указывает на конкретный путь.
🔸 Удаление символической ссылки не оказывает никакого влияния на оригинальный файл. Символическая ссылка просто перестаёт существовать, а оригинальный файл остаётся на месте, т. к. ссылка на сам файл и его данные не затрагиваются.
🔹 Жёсткая ссылка — это дополнительное имя для существующего файла на диске. Она указывает на те же самые блоки данных на диске, что и оригинальный файл, и имеет тот же номер inode.
🔹 Жёсткая ссылка фактически не отличается от оригинального файла. Изменения, сделанные через жёсткую ссылку, будут отражаться в оригинальном файле, так как они оба указывают на одни и те же данные.
🔹 Удаление жёсткой ссылки не приводит к удалению данных файла, пока существует хотя бы одна ссылка (имя файла) указывающая на эти данные. Файл будет физически удалён с диска только тогда, когда последняя жёсткая ссылка на него будет удалена.
🔸 Символическая ссылка — это отдельный файл, который содержит путь к другому файлу или другой директории. В отличие от жёсткой ссылки, она имеет свой собственный inode и блоки данных, которые хранят этот путь.
🔸 Если оригинальный файл, на который указывает символическая ссылка, будет перемещён или удалён, ссылка «сломается» и больше не сможет обеспечить доступ к файлу, потому что она указывает на конкретный путь.
🔸 Удаление символической ссылки не оказывает никакого влияния на оригинальный файл. Символическая ссылка просто перестаёт существовать, а оригинальный файл остаётся на месте, т. к. ссылка на сам файл и его данные не затрагиваются.
👍19❤2
Forwarded from Библиотека Go-разработчика | Golang
🏃 🏃 Самоучитель по Go для начинающих. Часть 11. Обработка ошибок. Паника. Восстановление. Логирование
Рассмотрим устройство механизма ошибок в Go и методы их обработки, познакомимся с функциями паники и восстановления, а также научимся логировать информацию о состоянии программы с помощью различных логеров.
👉 Читать гайд
📌 Остальные части в серии:
1. Особенности и сфера применения Go, установка, настройка
2. Ресурсы для изучения Go с нуля
3. Организация кода. Пакеты, импорты, модули. Ввод-вывод текста.
4. Переменные. Типы данных и их преобразования. Основные операторы
5. Условные конструкции if-else и switch-case. Цикл for. Вложенные и бесконечные циклы
6. Функции и аргументы. Области видимости. Рекурсия. Defer
7. Массивы и слайсы. Append и сopy. Пакет slices
8. Строки, руны, байты. Пакет strings. Хеш-таблица (map)
9. Структуры и методы. Интерфейсы. Указатели. Основы ООП
10. Введение в ООП. Наследование, абстракция, полиморфизм, инкапсуляция
Рассмотрим устройство механизма ошибок в Go и методы их обработки, познакомимся с функциями паники и восстановления, а также научимся логировать информацию о состоянии программы с помощью различных логеров.
👉 Читать гайд
📌 Остальные части в серии:
1. Особенности и сфера применения Go, установка, настройка
2. Ресурсы для изучения Go с нуля
3. Организация кода. Пакеты, импорты, модули. Ввод-вывод текста.
4. Переменные. Типы данных и их преобразования. Основные операторы
5. Условные конструкции if-else и switch-case. Цикл for. Вложенные и бесконечные циклы
6. Функции и аргументы. Области видимости. Рекурсия. Defer
7. Массивы и слайсы. Append и сopy. Пакет slices
8. Строки, руны, байты. Пакет strings. Хеш-таблица (map)
9. Структуры и методы. Интерфейсы. Указатели. Основы ООП
10. Введение в ООП. Наследование, абстракция, полиморфизм, инкапсуляция
👍5
💬 Как работает WithCancel из пакета context в Go?
Функция
Пример использования:
Здесь
При вызове
🔹 Канал
🔹 Все горутины или операции, которые «слушают» канал
Функция
WithCancel
из пакета context
в Go позволяет создать новый контекст, который можно отменить, на основе существующего родительского контекста. Она возвращает производный контекст (`ctx`) и функцию отмены (`cancel`), которая может быть вызвана для отмены этого контекста.Пример использования:
ctx, cancel := context.WithCancel(parentCtx)
Здесь
ctx
является новым контекстом, который наследует все характеристики и значения из parentCtx. cancel
— это функция, вызов которой отменяет ctx
и все связанные с ним дочерние контексты, если таковые имеются.При вызове
cancel():
🔹 Канал
Done()
для контекста ctx
будет закрыт. Это сигнализирует всем потребителям контекста, что операции должны быть прекращены как можно скорее.🔹 Все горутины или операции, которые «слушают» канал
Done()
контекста, могут реагировать на его закрытие, чтобы корректно остановить свою работу и освободить ресурсы.❤6🔥4👍2
💬 Для чего предназначена директория internal в Go-проекте?
Директория
Это особенно полезно в крупных проектах и при разработке библиотек, когда нужно чётко разграничить внутреннюю логику от API, который предоставляется пользователям. Директория
Директория
internal
в структуре Go-проекта используется для ограничения доступности кода. Код, помещенный в эту директорию, может быть импортирован и использован только внутри того же Go-модуля. Это предотвращает доступ к внутреннему коду из других модулей, что позволяет скрыть реализацию деталей, которые не предназначены для общедоступного API. Такой подход помогает управлять зависимостями в больших проектах.Это особенно полезно в крупных проектах и при разработке библиотек, когда нужно чётко разграничить внутреннюю логику от API, который предоставляется пользователям. Директория
internal
гарантирует, что внутренние компоненты не будут случайно использованы в других частях программы или в сторонних проектах, что способствует безопасности и стабильности кода.❤11👍4
💬 Какие особенности необходимо учитывать при встраивании типов в Go?
В Go поле структуры называется встроенным, если оно объявлено без имени. Например,
В структуре
Поскольку
📌 Основные особенности, которые необходимо учитывать:
1. Встраивание типов не должно использоваться только как синтаксический сахар для упрощения доступа к полю (например,
2. Встраивание типов не должно «продвигать» данные (поля) или поведение (методы), которые мы хотим скрыть от внешнего мира: например, если это позволяет клиентам получить доступ к поведению блокировки, которое должно оставаться приватным для структуры.
В Go поле структуры называется встроенным, если оно объявлено без имени. Например,
type Foo struct {
Bar // Встроенное поле
}
type Bar struct {
Baz int
}
В структуре
Foo
тип Bar
объявлен без связанного с ним имени; следовательно, это встроенное поле.Поскольку
Bar
содержит поле Baz
, это поле «продвигается» в Foo
. Таким образом, Baz
становится доступным из Foo
.📌 Основные особенности, которые необходимо учитывать:
1. Встраивание типов не должно использоваться только как синтаксический сахар для упрощения доступа к полю (например,
Foo.Baz()
вместо Foo.Bar.Baz()
).2. Встраивание типов не должно «продвигать» данные (поля) или поведение (методы), которые мы хотим скрыть от внешнего мира: например, если это позволяет клиентам получить доступ к поведению блокировки, которое должно оставаться приватным для структуры.
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
💬 Можно ли утверждать, что после уменьшения размера среза в Go память, занимаемая оставшимися элементами, будет освобождена?
Срез состоит из трех компонентов: указателя на начало среза в массиве, длины среза и его емкости. Емкость среза указывает на максимальное количество элементов, которое срез может вместить, не требуя перераспределения памяти.
Когда мы уменьшаем размер среза, (например,
Это означает, что элементы, которые находятся за пределами новой длины, но в пределах емкости среза, технически все еще занимают память и могут быть доступны при расширении среза до его первоначальной емкости.
Таким образом, GC очистит память старого массива (если на него не будут указывать другие срезы) только после реалокации памяти и переноса значений в новый срез.
Срез состоит из трех компонентов: указателя на начало среза в массиве, длины среза и его емкости. Емкость среза указывает на максимальное количество элементов, которое срез может вместить, не требуя перераспределения памяти.
Когда мы уменьшаем размер среза, (например,
s[:n]
, где n
меньше текущей длины среза s
), мы изменяем только длину среза, но не его емкость. Память, связанная с емкостью среза, остается выделенной, поскольку базовый массив, к которому срез имеет доступ, остается неизменным. Это означает, что элементы, которые находятся за пределами новой длины, но в пределах емкости среза, технически все еще занимают память и могут быть доступны при расширении среза до его первоначальной емкости.
Таким образом, GC очистит память старого массива (если на него не будут указывать другие срезы) только после реалокации памяти и переноса значений в новый срез.
❤4👍1
Forwarded from Библиотека нейросетей | ChatGPT, Midjourney, DeepSeek, Sora
This media is not supported in the widget
VIEW IN TELEGRAM
💬 Что такое procfs и sysfs в контексте ОС Linux?
🔹 procfs, или файловая система proc, является важным компонентом для мониторинга и управления процессами в ОС Linux. Она предоставляет динамический интерфейс к структурам данных ядра. Каждый запущенный процесс в системе представлен директорией в
Внутри каждой такой директории можно найти файлы и ссылки, предоставляющие информацию о состоянии процесса и позволяющие в некоторых случаях изменять параметры работы процесса. Например, файл
🔹 sysfs, или файловая система sys, используется для представления и управления информацией о драйверах и устройствах, которые присутствуют в системе. Эта файловая система структурирована по типам устройств и подсистемам, что делает её особенно удобной для получения информации о конфигурации оборудования и управления.
Например, через файлы в
🔹 procfs, или файловая система proc, является важным компонентом для мониторинга и управления процессами в ОС Linux. Она предоставляет динамический интерфейс к структурам данных ядра. Каждый запущенный процесс в системе представлен директорией в
/proc
с соответствующим PID как именем этой директории.Внутри каждой такой директории можно найти файлы и ссылки, предоставляющие информацию о состоянии процесса и позволяющие в некоторых случаях изменять параметры работы процесса. Например, файл
/proc/[pid]/status
содержит информацию о состоянии процесса, его памяти, приоритете и другие важные данные.🔹 sysfs, или файловая система sys, используется для представления и управления информацией о драйверах и устройствах, которые присутствуют в системе. Эта файловая система структурирована по типам устройств и подсистемам, что делает её особенно удобной для получения информации о конфигурации оборудования и управления.
Например, через файлы в
/sys/class/gpio/
можно управлять GPIO пинами на устройствах, поддерживающих это. sysfs также используется для настройки параметров устройств, например, изменения яркости экрана или управления питанием.👍1
💬 Для чего предназначена директива go:generate?
Директива
Она служит инструкцией для инструмента
📌 Пример использования:
Здесь
Директива
go:generate
используется для автоматизации генерации кода или других команд, которые должны выполняться перед сборкой пакета. Она служит инструкцией для инструмента
go generate
, который нужно запустить вручную или как часть сценария сборки. Пример использования go:generate
может включать генерацию моков для тестирования, предварительную обработку или создание дополнительных исходных файлов на основе шаблонов.📌 Пример использования:
//go:generate mockgen -destination=mocks/mock_myinterface.go -package=mocks my/package MyInterface
Здесь
go:generate
указывает инструменту go generate
выполнить команду mockgen
для создания мок-версии интерфейса MyInterface
.💬 Что такое RPC и как его поддерживает Go?
Remote Procedure Call (удаленный вызов процедур) — технология взаимодействия между клиентом и сервером, которая позволяет клиенту вызывать процедуры (функции, методы) на удаленном сервере, как если бы они были локальными.
Это обеспечивает абстракцию взаимодействия по сети и позволяет программам работать в распределенной среде, скрывая сложности передачи данных и выполнения удаленных операций.
Go имеет поддержку RPC через пакеты стандартной библиотеки, в первую очередь
Remote Procedure Call (удаленный вызов процедур) — технология взаимодействия между клиентом и сервером, которая позволяет клиенту вызывать процедуры (функции, методы) на удаленном сервере, как если бы они были локальными.
Это обеспечивает абстракцию взаимодействия по сети и позволяет программам работать в распределенной среде, скрывая сложности передачи данных и выполнения удаленных операций.
Go имеет поддержку RPC через пакеты стандартной библиотеки, в первую очередь
net/rpc
и net/rpc/jsonrpc
.👍4🤔2
💬 Что такое микросервисная архитектура?
Микросервисная архитектура — распространенный подход к разработке ПО, когда приложение разбивается на небольшие автономные компоненты (микросервисы) с четко определенными интерфейсами.
Каждый отдельный сервис выполняет определённую функцию и общается с другими сервисами через API. Эти сервисы обычно разрабатываются, развёртываются и управляются независимо друг от друга.
Микросервисная архитектура — распространенный подход к разработке ПО, когда приложение разбивается на небольшие автономные компоненты (микросервисы) с четко определенными интерфейсами.
Каждый отдельный сервис выполняет определённую функцию и общается с другими сервисами через API. Эти сервисы обычно разрабатываются, развёртываются и управляются независимо друг от друга.
👍5
Forwarded from Библиотека Go-разработчика | Golang
💡
👉 Юзкейс: логирование входящих запросов с помощью middleware перед обработкой запросов.
#tip by Golangbot
io.TeeReader
можно использовать для копирования содержимого одного ридера в новый. Этот метод полезен, когда тело HTTP-запроса нужно прочитать дважды.👉 Юзкейс: логирование входящих запросов с помощью middleware перед обработкой запросов.
#tip by Golangbot
🔥17