💬 Что такое 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
💬 Как использовать буферизированные каналы в качестве семафоров для ограничения выполнения горутин?
Когда нам нужно управлять тем, сколько горутин могут одновременно получить доступ к ресурсу, использование семафора является надежным подходом.
Мы можем создать семафор с использованием буферизированного канала, где размер канала определяет, сколько горутин могут работать одновременно.
Вот что происходит:
🔹 Горутина отправляет значение в канал, занимая один слот.
🔹 После выполнения своей задачи она удаляет значение, тем самым освобождая этот слот для другой горутины.
В примере:
🔹
🔹
☑️ Если нам нужен более чистый способ, мы могли бы создать тип Semaphore, который обрабатывает все действия, связанные с семафором.
☑️ Использование кастомного типа Semaphore упрощает управление доступом к ресурсам в наших функциях.
☑️ Также существует реализация семафора в пакете
Когда нам нужно управлять тем, сколько горутин могут одновременно получить доступ к ресурсу, использование семафора является надежным подходом.
Мы можем создать семафор с использованием буферизированного канала, где размер канала определяет, сколько горутин могут работать одновременно.
Вот что происходит:
🔹 Горутина отправляет значение в канал, занимая один слот.
🔹 После выполнения своей задачи она удаляет значение, тем самым освобождая этот слот для другой горутины.
В примере:
🔹
wg.Add(10)
: готовимся к завершению задач 10 горутинами.🔹
make(chan struct{}, 3)
: создает семафор, который позволяет одновременно работать только трем горутинам.☑️ Если нам нужен более чистый способ, мы могли бы создать тип Semaphore, который обрабатывает все действия, связанные с семафором.
☑️ Использование кастомного типа Semaphore упрощает управление доступом к ресурсам в наших функциях.
☑️ Также существует реализация семафора в пакете
golang.org/x/sync/semaphore
. Он позволяет горутине использовать более одного слота, что полезно в сценариях, где задачи различаются по потреблению ресурсов.👍23
🦾🧠🏋️Качаем мозги к лету!
Курс «Алгоритмы и структуры данных» для тех, кто хочет научиться работать с алгоритмами, подготовиться к собеседованию крупную IT-компанию и начать брать более сложные проекты.
➡️ Алгоритмы и структуры данных35 990 ₽ 21 594 ₽
⭐️ Переходите и активируйте бесплатные вводные занятия курса — https://proglib.io/w/da6727d1
Вас ждут:
– 150 практических заданий и 47 видеолекций
– бессрочный доступ к обучению
– поддержка преподавателя в чате
А также очень харизматичный спикер из Яндекса 🙌🏻
Курс «Алгоритмы и структуры данных» для тех, кто хочет научиться работать с алгоритмами, подготовиться к собеседованию крупную IT-компанию и начать брать более сложные проекты.
➡️ Алгоритмы и структуры данных
⭐️ Переходите и активируйте бесплатные вводные занятия курса — https://proglib.io/w/da6727d1
Вас ждут:
– 150 практических заданий и 47 видеолекций
– бессрочный доступ к обучению
– поддержка преподавателя в чате
А также очень харизматичный спикер из Яндекса 🙌🏻
🥱3
Forwarded from Библиотека Go-разработчика | Golang
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍5
💬 Что такое Profile-guided optimization и для чего она предназначена?
Profile-guided optimization (PGO) — это представленная в Go 1.21 (анонсирована в Go 1.20 preview) техника оптимизации компилятора, которая использует данные о профиле выполнения программы, чтобы улучшить качество генерируемого исполняемого кода.
📌 PGO работает в два этапа:
1. Сбор данных: первоначально программа компилируется с включением инструментов профилирования, которые собирают информацию о частоте и условиях выполнения различных частей кода во время выполнения.
2. Оптимизация: на основе этих данных программа повторно компилируется, при этом компилятор использует информацию о профиле для выполнения оптимизаций.
Преимущества PGO включают улучшение производительности программы, так как оптимизации делают исполняемый код более приспособленным к реальным кейсам использования. Это особенно важно в приложениях, где критически важна производительность.
👉 Подробнее
Profile-guided optimization (PGO) — это представленная в Go 1.21 (анонсирована в Go 1.20 preview) техника оптимизации компилятора, которая использует данные о профиле выполнения программы, чтобы улучшить качество генерируемого исполняемого кода.
📌 PGO работает в два этапа:
1. Сбор данных: первоначально программа компилируется с включением инструментов профилирования, которые собирают информацию о частоте и условиях выполнения различных частей кода во время выполнения.
2. Оптимизация: на основе этих данных программа повторно компилируется, при этом компилятор использует информацию о профиле для выполнения оптимизаций.
Преимущества PGO включают улучшение производительности программы, так как оптимизации делают исполняемый код более приспособленным к реальным кейсам использования. Это особенно важно в приложениях, где критически важна производительность.
👉 Подробнее
go.dev
Profile-guided optimization preview - The Go Programming Language
Introduction to profile-guided optimization, available as a preview in Go 1.20.
👍6🔥5
Forwarded from Библиотека Go-разработчика | Golang
🏃 🏃 🏃 Самоучитель по Go для начинающих. Часть 12. Обобщенное программирование. Дженерики
В этой части самоучителя подробно изучим парадигму обобщенного программирования и её реализацию в языке 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. Обработка ошибок. Паника. Восстановление. Логирование
В этой части самоучителя подробно изучим парадигму обобщенного программирования и её реализацию в языке 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. Обработка ошибок. Паника. Восстановление. Логирование
👍7
Forwarded from Библиотека нейросетей | ChatGPT, Midjourney, DeepSeek, Sora
Вы когда-нибудь задумывались, как можно использовать искусственный интеллект для того, чтобы подготовиться к техническим собеседованиям лучше, быстрее и эффективнее? Мы вот — да! И поэтому подготовили 55 промтов, которые помогут сделать это.
В статье собраны шаблоны запросов, которые желательно «докрутить» под себя.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
💬 Для каких целей могут использоваться функции с префиксом 'Must'?
Функции с префиксом "Must" ("must") предупреждают, что они могут вызвать панику, если что-то пойдет не так. Они часто используются для:
🔹 Инициализации задач, которые не должны завершаться неудачей, например, настройка глобальных переменных в начале приложения, настройка регулярных выражений, подключение к базам данных и т. д.
🔹 В кейсах тестирования они позволяют немедленно завершить тест с помощью
Функции Must упрощают обработку ошибок в конкретных контекстах, но их следует использовать осторожно, чтобы избежать нежелательной паники.
Функции с префиксом "Must" ("must") предупреждают, что они могут вызвать панику, если что-то пойдет не так. Они часто используются для:
🔹 Инициализации задач, которые не должны завершаться неудачей, например, настройка глобальных переменных в начале приложения, настройка регулярных выражений, подключение к базам данных и т. д.
🔹 В кейсах тестирования они позволяют немедленно завершить тест с помощью
t.Fatal
, если что-то идет не так.Функции Must упрощают обработку ошибок в конкретных контекстах, но их следует использовать осторожно, чтобы избежать нежелательной паники.
👍11🤔2❤1
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
💬 Как в Go отформатировать строку без её вывода?
С использованием функции
Мы можем использовать
С использованием функции
fmt.Sprintf.
Она работает аналогично fmt.Printf,
но вместо вывода результата в стандартный вывод, она возвращает отформатированную строку. Мы можем использовать
fmt.Sprintf
для создания строк с переменными или сложными форматами, которые затем могут быть использованы в коде или сохранены для последующего использования.🥱17👍5
💬 Как использовать io.TeeReader в Go для логирования содержимого HTTP-запроса перед его обработкой? Каковы потенциальные преимущества и ограничения такого подхода?
Преимущества использования
📌 Простой пример:
В примере мы создаем мидлваре, которая использует
io.TeeReader
в Go используется для одновременного чтения данных из io.Reader
и копирования этих данных в io.Writer
. Это особенно полезно при логировании содержимого HTTP-запросов в мидлваре, позволяя одновременно читать и логировать данные, не теряя их для последующей обработки.Преимущества использования
io.TeeReader
включают возможность прозрачного логирования данных запроса без изменения основного потока чтения данных. Ограничение заключается в том, что использование io.TeeReader
может привести к незначительному увеличению задержек из-за дополнительной операции записи во время чтения данных.📌 Простой пример:
package main
import (
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"strings"
)
func logRequestData(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Создание буфера для логирования данных запроса
var buf strings.Builder
teeReader := io.TeeReader(r.Body, &buf)
// Чтение и логирование содержимого запроса
body, err := ioutil.ReadAll(teeReader)
if err != nil {
http.Error(w, "Ошибка при чтении тела запроса", http.StatusInternalServerError)
return
}
// Запись данных обратно в тело запроса для последующей обработки
r.Body = ioutil.NopCloser(strings.NewReader(buf.String()))
// Вывод тела запроса в лог
log.Printf("Received request with body: %s", body)
// Продолжение обработки запроса
next.ServeHTTP(w, r)
})
}
func mainHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Запрос обработан")
}
func main() {
finalHandler := http.HandlerFunc(mainHandler)
http.Handle("/", logRequestData(finalHandler))
log.Println("Сервер запущен на порту 8080")
http.ListenAndServe(":8080", nil)
}
В примере мы создаем мидлваре, которая использует
io.TeeReader
для чтения тела HTTP-запроса, одновременно логируя его в stdout. Это позволяет сохранить неизменным первоначальный поток данных запроса для дальнейшей обработки в последующих обработчиках.🔥5👍3
💬 Допустимо ли возвращать ответ "HTTP 200 OK", когда на стороне сервера произошла ошибка (сведения об ошибке будут содержаться внутри тела ответа)?
Допустимо для ошибок бизнес-логики приложения, однако в большинстве случаев это зависит от конкретного юзкейса.
Статус "200 OK" зачастую используется только тогда, когда запрос был успешно обработан и результаты этой обработки соответствуют ожиданиям клиента.
В случае возникновения ошибки следует использовать соответствующие статусы ответа HTTP, которые точно отражают природу проблемы. Например:
🔹
🔹
🔹
🔹
🔗 Все коды состояния ответа HTTP
🔗 Обсуждение на StackOverflow
Допустимо для ошибок бизнес-логики приложения, однако в большинстве случаев это зависит от конкретного юзкейса.
Статус "200 OK" зачастую используется только тогда, когда запрос был успешно обработан и результаты этой обработки соответствуют ожиданиям клиента.
В случае возникновения ошибки следует использовать соответствующие статусы ответа HTTP, которые точно отражают природу проблемы. Например:
🔹
500 Internal Server Error
— для неустранимых ошибок на стороне сервера.🔹
503 Service Unavailable
— если сервер временно недоступен, например, из-за перегрузки или технического обслуживания.🔹
400 Bad Request
— если ошибка возникла из-за некорректных данных, предоставленных клиентом.🔹
404 Not Found
— если запрос был направлен на несуществующий ресурс.🔗 Все коды состояния ответа HTTP
🔗 Обсуждение на StackOverflow
Wikipedia
List of HTTP status codes
Hypertext Transfer Protocol (HTTP) response status codes are issued by a server in response to a client's request made to the server. It includes codes from IETF Request for Comments (RFCs), other specifications, and some additional codes used in some common…
❤5