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

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
361 - Telegram Web
Telegram Web
💬 Как использовать буферизированные каналы в качестве семафоров для ограничения выполнения горутин?

Когда нам нужно управлять тем, сколько горутин могут одновременно получить доступ к ресурсу, использование семафора является надежным подходом.

Мы можем создать семафор с использованием буферизированного канала, где размер канала определяет, сколько горутин могут работать одновременно.

Вот что происходит:

🔹 Горутина отправляет значение в канал, занимая один слот.
🔹 После выполнения своей задачи она удаляет значение, тем самым освобождая этот слот для другой горутины.

В примере:

🔹 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 видеолекций

– бессрочный доступ к обучению

– поддержка преподавателя в чате

А также очень харизматичный спикер из Яндекса 🙌🏻
🥱3
👩‍💻 Функция Join пакета errors конкатенирует список ошибок и возвращает ошибку, если хотя бы одна из переданных ошибок не nil.

Join возвращает nil, если все переданные ошибки равны nil.

#tip by Golangbot
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 включают улучшение производительности программы, так как оптимизации делают исполняемый код более приспособленным к реальным кейсам использования. Это особенно важно в приложениях, где критически важна производительность.

👉 Подробнее
👍6🔥5
🏃 🏃 🏃 Самоучитель по 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. Обработка ошибок. Паника. Восстановление. Логирование
👍7
😉 55 промтов для ChatGPT, которые помогут подготовиться к собеседованию

Вы когда-нибудь задумывались, как можно использовать искусственный интеллект для того, чтобы подготовиться к техническим собеседованиям лучше, быстрее и эффективнее? Мы вот — да! И поэтому подготовили 55 промтов, которые помогут сделать это.

В статье собраны шаблоны запросов, которые желательно «докрутить» под себя.

🔗 Читать статью
🔗 Зеркало
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
💬 Для каких целей могут использоваться функции с префиксом 'Must'?

Функции с префиксом "Must" ("must") предупреждают, что они могут вызвать панику, если что-то пойдет не так. Они часто используются для:

🔹 Инициализации задач, которые не должны завершаться неудачей, например, настройка глобальных переменных в начале приложения, настройка регулярных выражений, подключение к базам данных и т. д.
🔹 В кейсах тестирования они позволяют немедленно завершить тест с помощью t.Fatal, если что-то идет не так.

Функции Must упрощают обработку ошибок в конкретных контекстах, но их следует использовать осторожно, чтобы избежать нежелательной паники.
👍11🤔21
🧑‍💻 Статьи для 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, которые точно отражают природу проблемы. Например:

🔹 500 Internal Server Error — для неустранимых ошибок на стороне сервера.
🔹 503 Service Unavailable — если сервер временно недоступен, например, из-за перегрузки или технического обслуживания.
🔹 400 Bad Request — если ошибка возникла из-за некорректных данных, предоставленных клиентом.
🔹 404 Not Found — если запрос был направлен на несуществующий ресурс.

🔗 Все коды состояния ответа HTTP
🔗 Обсуждение на StackOverflow
5
💬 Что из себя представляет механизм method value и чем он полезен?

Method value — механизм, который позволяет ссылаться на метод объекта с привязкой к конкретному экземпляру этого объекта. Это значит, что мы можем сохранить ссылку на метод определённого экземпляра и использовать эту ссылку для вызова метода позже, при этом метод автоматически будет вызываться для связанного с ним экземпляра.

📌 Как это работает: когда мы берём метод от экземпляра структуры или типа, Go автоматически создаёт функцию, которая "замыкает" этот экземпляр внутри себя. Эта функция при вызове будет применять метод к тому экземпляру, для которого она была создана.

📌 Пример:


type Counter struct {
value int
}

func (c *Counter) Increment() {
c.value++
}

func main() {
c := &Counter{value: 10}
increment := c.Increment // Сохраняем method value
increment() // Вызываем метод через сохранённую ссылку
fmt.Println(c.value) // Выведет 11
}


В примере increment является method value, которое привязано к конкретному экземпляру c. Вызов increment() эквивалентен вызову c.Increment().

Method value особенно полезны в ситуациях, когда необходимо передать метод как аргумент функции или сохранить метод для последующего вызова. Это позволяет использовать методы объектов так, как если бы они были обычными функциями, при этом сохраняя контекст вызова внутри метода.
👍25🥱3🤔1
💬 Чем отличаются сигналы Linux? Какие можно перехватить?

Сигналы в Linux представляют собой ограниченную форму межпроцессного взаимодействия, используемую для отправки уведомлений процессу о различных событиях. Они часто используются для уведомления процесса о необходимости завершения работы или информирования о возникновении какой-либо ошибки.

📌 Основные различия:

1. Синхронные сигналы — вызываются ошибками в программе (например, деление на ноль). Эти сигналы отправляются напрямую процессу, выполняющему ошибочное действие.
2. Асинхронные сигналы — посылаются внешними процессами или системой. Например, SIGKILL или SIGTERM, отправляемые для завершения процесса.

📌 Перехватываемые и неперехватываемые сигналы:

🔹 Перехватываемые сигналы могут быть обработаны программой. Программа может определить функцию-обработчик для таких сигналов, изменяя стандартное поведение. Например, SIGTERM и SIGUSR1 можно перехватить и обработать, выполнив определённые действия перед завершением программы или инициированием других процедур.
🔹 Неперехватываемые сигналы нельзя перехватить или проигнорировать. Эти сигналы немедленно выполняют своё стандартное действие. Примером неперехватываемого сигнала является SIGKILL, который всегда немедленно завершает процесс.

📌 Примеры перехватываемых сигналов:
🔹 SIGTERM — просит процесс завершиться. Это корректный способ попросить программу завершить свою работу.
🔹 SIGHUP — уведомляет процесс о потере управляющего терминала. Часто используется для перезагрузки конфигураций сервисов.
🔹 SIGUSR1, SIGUSR2 — резервируются для использования в пользовательских приложениях.

📌 Примеры неперехватываемых сигналов:
🔹 SIGKILL — немедленно завершает процесс. Не может быть перехвачен или обработан.
🔹 SIGSTOP — останавливает (приостанавливает) процесс до получения сигнала SIGCONT.
👍191
💬 Что такое идемпотентность?

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

В мире программирования операция считается идемпотентной, если ее однократное выполнение имеет тот же эффект, что и многократное. Например, операция присваивания x = 1 идемпотентна, потому что после ее выполнения x всегда будет хранить 1, независимо от того, сколько раз ее выполнить.

Точно так же HTTP-метод PUT является идемпотентным, поскольку многократная отправка ресурса в какое-либо место ничего не изменит: повторная отправка не даст ничего нового. Операция x += 1, однако, не является идемпотентной, потому что после каждого ее выполнения создается новое состояние.
👍115
💬 В чем преимущество использования iota в Go?

iota — это предопределенное значение, которое можно использовать в объявлении const для создания последовательности связанных значений.
Использование приема с iota избавляет от необходимости вручную присваивать значения константам. Вместо этого можно записать такое определение:

type EventType byte
const (
_ = iota // iota == 0; игнорировать нулевое значение EventDelete
EventType = iota // iota == 1
EventPut // iota == 2; неявное присваивание
)


В объявлении константы iota представляет последовательно увеличивающиеся нетипизированные целочисленные значения, которые можно использовать для создания набора связанных констант. В начале каждого объявления const идентификатор iota получает нулевое значение и затем увеличивается с каждой операцией присваивания значения новой константе (независимо от использования ссылки на идентификатор iota).

Поскольку iota является нетипизированным числом, его можно использовать для присваивания типизированных значений без явного приведения типов, даже константе с типом float64:

const (
u = iota * 42 // iota == 0; u == 0 (нетипизированная целочисленная константа)
v float64 = iota * 42 // iota == 1; v == 42.0 (константа типа float64)
)


Ключевое слово iota допускает неявное перечисление, что делает тривиальным создание произвольно длинных наборов связанных констант, как это показано в следующем примере, где перечисляются различные единицы измерения размеров в байтах:

type ByteSize uint64

const (
_ = iota
KB ByteSize = 1 << (10 * iota) MB
GB
TB
PB
)
👍11
💬 Почему следует избегать использования context.Background() напрямую? Какие есть альтернативы?

Использование context.Background() напрямую не рекомендуется, потому что он не предоставляет способа остановить или отменить операции, если что-то пойдет не так. Этот контекст самый простой, без значений, сроков и сигналов отмены. Это может стать проблемой, когда задачи застревают или требуют плавного завершения.

Чтобы справиться с этим, лучше использовать context.WithTimeout, context.WithCancel или context.WithDeadline. Эти контексты позволяют задавать время ожидания или возможность отмены, что делает горутины более управляемыми и надежными.

📌 Вот примеры использования:

🔸 context.WithTimeout(ctx, duration): задает время ожидания для выполнения задачи.
🔸 context.WithCancel(ctx): позволяет отменить задачу вручную.
🔸 context.WithDeadline(ctx, deadline): устанавливает конкретное время завершения задачи.

Можно также использовать функции с суффиксом Cause (например, context.WithTimeoutCause), которые дают более детальные сообщения об ошибках (например, "context deadline exceeded: custom message").

В случае работы с каналами, чтобы не ждать ответа бесконечно, можно использовать конструкцию select с тайм-аутом:

select {
case result := <-ch:
fmt.Println("Received result:", result)
case <-time.After(5 * time.Second):
fmt.Println("Timed out")
}


Однако, time.After может привести к краткосрочным утечкам памяти. В таких случаях лучше использовать time.Timer или time.Ticker для лучшего контроля над временем.
👍3
Самые полезные каналы для программистов в одной подборке!

Сохраняйте себе, чтобы не потерять 💾

🔥Для всех

Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
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 запрещена на территории РФ
👍1
2025/07/13 15:47:58
Back to Top
HTML Embed Code: