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
569 - Telegram Web
Telegram Web
Dynamic Notification System — это проект на Go, разработанный для создания масштабируемого и гибкого планировщика уведомлений!

Он поддерживает отправку уведомлений через различные каналы, такие как Slack, Email, SMS, Webhook и другие. Система позволяет легко добавлять новые платформы с помощью динамической архитектуры плагинов, не требуя перезапуска приложения.

🔐 Лицензия: MIT

Github

Junior Вакансии Go тут
1
Linux: эффективная многопроцессорность
Используем Go

Автор:
Олег Цилюрик
Год издания: 2024

#go #linux #ru

Скачать книгу
👎4👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Zasper — это IDE, разработанная с нуля для поддержки массового параллелизма!

Она разработана на языке Go для обеспечения высокой параллельности и эффективности использования ресурсов. Zasper отличается низким потреблением памяти и процессора, позволяя работать с большими объемами данных на локальных машинах. Она доступен как в виде приложения Electron, так и как веб-приложение.

🔐 Лицензия: AGPL-3.0

Github

@golangprofi
😱2
Профессиональный Go

Автор:
Фриман Адам
Год издания: 2022

#go #ru

Скачать книгу
3👎1🤔1
🤩 Улучшение тестов на Go: почему стоит использовать "if got, want"

Техника проверки if got != want { t.Errorf(...) } в тестах Go — это простой и эффективный способ проверки значений, который полностью соответствует философии языка. Она не требует сторонних библиотек, остаётся прозрачной и легко читаемой, что особенно важно для минималистичного и понятного кода.

Благодаря своей простоте, этот подход легко масштабируется: от проверки одного значения до сложных сценариев с таблицами тестирования. Кроме того, стандартный вывод ошибок в Go обычно достаточно информативен, чтобы быстро понять, что пошло не так.

👀 Подробнее про технику с примерами кода можно почитать тут

Согласны?

Junior Вакансии Go тут
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
📦 Пакет embed в Go

Если вы когда-либо работали с Go, то знаете, как важно уметь управлять статическими ресурсами. Пакет embed (представленный в Go 1.16) решает эту задачу элегантно: он позволяет встраивать файлы прямо в исполняемый бинарный файл, что делает приложение автономным и упрощает его развертывание.

💡 Зачем использовать embed?
С помощью директивы //go:embed вы можете встроить файлы (например, HTML, CSS, конфигурационные файлы или изображения) прямо в бинарный файл. Это исключает необходимость поставлять эти файлы отдельно, и ваши приложения становятся более компактными и безопасными.

🛠 Как это работает?
Вы указываете директиву //go:embed перед переменной.
Используете типы данных string для текстовых файлов, []byte для бинарных данных или embed.FS для работы с целыми директориями.

🚀 Пример использования:
package main

import (
"embed"
"fmt"
)

//go:embed hello.txt
var hello string

func main() {
fmt.Println(hello)
}

В этом примере файл hello.txt встроен в приложение, и его содержимое доступно как строка.

Почему стоит использовать embed?
Удобство развертывания: всё в одном файле — не нужно беспокоиться о поставке отдельных файлов.
Безопасность: встроенные файлы не могут быть изменены после компиляции.
Автономность: ваши приложения не зависят от внешних файлов и легко переносятся между окружениями.

Когда не стоит использовать embed?
Когда нужно работать с динамически изменяющимися файлами (например, конфигурациями, которые могут меняться в процессе работы приложения).
Для очень больших файлов, так как это увеличивает размер бинарника.

Чат с Go вакансиями
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍4❤‍🔥1
👣 Golang + Gin + Postgres + Docker + gRPC + NGINX

Go + HTMX-шаблон, содержащий все Необходимые Инструменты для создания веб-приложений.

▪️ Github

#golang #htmx #javascript #programming #webdev

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
This media is not supported in your browser
VIEW IN TELEGRAM
Немного о языке
программирования GO


👉 Golang Юниор | #shorts
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6😨3🙊1
👣 Airo – это инновационный инструмент для Go разработчиков, который упрощает и ускоряет процесс интеграции и позволяет развертывать проекты прямо с локального компьютера на рабочий сервер.

Kubernetes, Platform as a Service (PaaS) и CI/CD - это мощные решения, но иногда они оказываются сложнее, чем требуется вашему проекту. Если вам нравится управлять своим сервером, использование Airo может быть значительно дешевле и обеспечит больший контроль над техническими деталями вашего проекта.

Он предоставляет удобный интерфейс и расширяемые возможности.

▪️ Простота использования: Благодаря интуитивно понятному интерфейсу, начать работать с Airo можно без длительного изучения сложной документации.
▪️ Гибкость и настройка: Инструмент легко адаптируется под специфические требования любого проекта, позволяя интегрировать дополнительные модули и плагины по мере необходимости.
▪️ Оптимизированный код Airo обеспечивает быструю обработку задач, что особенно важно при работе с большими объемами данных или в условиях сжатых сроков разработки.
▪️ По сравнению с аналогичными инструментами, Airo предлагает оптимальное сочетание скорости, удобства и расширяемости, что позволяет разработчикам работать эффективнее и достигать лучших результатов.

git clone https://github.com/yourusername/airo.git
cd airo
make install
airo deploy


▪️ GitHub: https://github.com/bypirob/airo

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
👣 Seabird — интегрированная среда разработки (IDE) для Kubernetes, ориентированная на пользователей GNOME!

🌟 Он предоставляет удобный интерфейс для исследования и управления кластерами Kubernetes. Включает терминал для выполнения команд, мониторинг через логи и метрики, а также редактор ресурсов с удобной справочной информацией по API.

🔐 Лицензия: MPL-2.0

🖥 Github
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Как язык GO начал
набирать популярность?


👉 Golang Юниор | #shorts
Please open Telegram to view this post
VIEW IN TELEGRAM
👎31👍1
Язык Go Для Начинающих

Автор:
Максим Жашкевич
Год издания:
2020

#go #ru

Скачать книгу
💩10🤡2🤮1🤣1
👣 Высокопроизводительное кэширование с помощью Redis и Go

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

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

Вместо этого они предлагают []byte API, с которыми вы взаимодействуете следующим образом:

// В этом коде используется https://github.com/redis/go-redis, но те же
// ограничения действуют для Rueidis и Redigo.
func redisHandler(w http.ResponseWriter, r *http.Request) {
ctx := context.Background()

// Extract key from RequestURI
key := strings.TrimLeft(r.RequestURI, "/")

// Get the value from Redis as a byte slice
val, err := rdb.Get(ctx, key).Bytes()
if err == redis.Nil {
http.Error(w, "Key not found in Redis", http.StatusNotFound)
return
} else if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}

_, err = w.Write(val)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}


Этот паттерн работает хорошо, если вы кэшируете небольшие объекты, но если вы кэшируете объекты размером более 1 кб, []byte-ориентированные API работют не так хорошо.


В протоколе Redis нет ничего такого, что мешало бы создать потоковый API. Поэтому пердставляем redjet, библиотеку Redis, ориентированную на производительность.

С помощью redjet вы можете написать приведенный выше код следующим образом:

func redisHandler(w http.ResponseWriter, r *http.Request) {
ctx := context.Background()

// Извлечение ключа из RequestURI
key := strings.TrimLeft(r.RequestURI, "/")

// Передаем значение непосредственно из Redis в ответ.
_, err := rdb.Command("GET", key).WriteTo(w)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}


Код стал проще и эффективнее.

go get github.com/coder/redjet@latest

▪️Github
▪️Читать дальше
▪️Бенчмарки

@golangprofi
👍5🤔2❤‍🔥1👎1👌1
📚Библиотеки и инструменты для создания и отправки электронной почты на GO.

▪️chasquid - SMTP-сервер, написанный на Go.

▪️douceur - CSS-инлайнер для ваших HTML-писем.

▪️email - Надежная и гибкая библиотека работы с электронной почтой на Go.

▪️email-verifier - Библиотека Go для проверки электронной почты без отправки писем.

▪️go-dkim - Библиотека DKIM для подписи и проверки электронной почты.

▪️go-email-normalizer - Библиотека Golang для нормализации электронной почты.

▪️go-email-validator - Модульный валидатор электронной почты для проверки синтаксиса, содержания, smtp и т. д..

▪️go-imap - Библиотека IMAP для клиентов и серверов.

▪️go-mail - Простая библиотека Go для отправки писем на Go.

▪️go-message - Потоковая библиотека для Internet Message Format и почтовых сообщений.

▪️go-premailer - Встраиваемая стилизация для HTML-почты в Go.

▪️go-simple-mail - Очень простой пакет для отправки электронной почты с SMTP Keep Alive и двумя таймаутами: Connect и Send.

▪️Hectane - Легкий SMTP-клиент, предоставляющий API.

▪️hermes - Пакет Golang, генерирующий HTML-письма.

▪️Maddy - Почтовый сервер "все в одном" (SMTP, IMAP, DKIM, DMARC, MTA-STS, DANE).

▪️mailchain - Отправка зашифрованных писем на адреса блокчейна, написанная на Go.

▪️mailgun-go - Библиотека Go для отправки почты с помощью Mailgun API.

▪️MailHog - тестирование электронной почты и SMTP с веб-интерфейсом и API.

▪️Mailpit - Инструмент тестирования электронной почты и SMTP для разработчиков.

▪️mailx - Mailx - это библиотека, которая упрощает отправку электронной почты по SMTP. Она является расширением стандартной библиотеки golang net/smtp.

▪️SendGrid - Go-библиотека SendGrid для отправки электронной почты.

▪️smtp - Машина состояний протокола SMTP-сервера.

▪️smtpmock - Легкий настраиваемый многопоточный тестовый SMTP-сервер. Имитирует любое поведение SMTP в вашей тестовой среде.

▪️truemail-go - Настраиваемый валидатор/верификатор электронной почты на языке Golang. Проверяет почту через Regex, DNS, SMTP и многое другое.

👉 Golang Юниор | #golang
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2👌1
This media is not supported in your browser
VIEW IN TELEGRAM
Enola Holmes

Это усовершенствованная версия утилиты Sherlock и современный CLI-инструмент, написанный на Go, который позволяет находить учетные записи в социальных сетях по имени пользователя.

go install github.com/theyahya/enola/cmd/enola@latest

▪️ Github

👉 Golang Юниор | #golang
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚1
Подборка книг по Go на русском языке.
Скачивайте и читайте.

Программирование на языке Go
Автор: Саммерфильд Марк

Go. Рецепты программирования
Автор: Аарон Торрес

Black Hat Go
Автор: Том Стил

Облачный Go
Автор: Титмус М. А.

Практический Go
Автор: Амит Саха

Golang для профи
Автор: Михалис Цукалос

#подборка #ru
10
👣 Задача с подвохом, который связан с изменением поведения циклов, введенным в Go 1.22 (и, соответственно, актуальным для Go 1.24).

Задача: Что выведет следующий код при компиляции и запуске с использованием Go 1.24?


package main

import (
"fmt"
"sync"
"time"
)

func main() {
var wg sync.WaitGroup
count := 3

fmt.Println("Запуск горутин...")
wg.Add(count)

for i := 0; i < count; i++ {
// Запускаем горутину в каждой итерации
go func() {
defer wg.Done()
// Имитируем небольшую работу
time.Sleep(time.Duration(10) * time.Millisecond)
// Используем переменную цикла 'i' внутри горутины
fmt.Printf("Горутина видит i = %d\n", i)
}()
}

fmt.Println("Ожидание завершения горутин...")
wg.Wait()
fmt.Println("Все горутины завершены.")
}



Разбор:
Классическая проблема (до Go 1.22): В версиях Go до 1.22 существовала известная проблема с захватом переменных цикла в замыканиях (функциях, создаваемых внутри цикла, как наша анонимная горутина). Переменная i была одна на весь цикл.

Когда горутины реально начинали выполняться (после небольшой задержки time.Sleep), цикл for, скорее всего, уже завершался. К этому моменту переменная i имела бы свое конечное значение (в данном случае 3, так как цикл завершается, когда i становится равным count).

Поэтому в старых версиях Go этот код, скорее всего, вывел бы:
Запуск горутин...
Ожидание завершения горутин...
Горутина видит i = 3
Горутина видит i = 3
Горутина видит i = 3

Все горутины завершены.

(Порядок строк "Горутина видит..." мог быть разным). Чтобы обойти это, раньше приходилось делать так: i := i внутри цикла перед запуском горутины, чтобы создать копию переменной для каждой итерации.

Новое поведение (Go 1.22 и новее, включая 1.24): Начиная с Go 1.22, семантика переменных цикла for была изменена для предотвращения этой распространенной ошибки. Теперь переменная цикла (i в нашем случае) пересоздается для каждой итерации.

Это означает, что каждая горутина захватывает свою собственную копию i, соответствующую значению на момент этой итерации.

Ожидаемый вывод (Go 1.24): Благодаря изменению в Go 1.22, каждая горутина теперь корректно видит значение i той итерации, в которой она была запущена. Поэтому вывод будет (порядок строк "Горутина видит..." может варьироваться из-за недетерминированного планирования горутин):
Запуск горутин...
Ожидание завершения горутин...
Горутина видит i = 0
Горутина видит i = 1
Горутина видит i = 2
Все горутины завершены.
Use code with caution.
Или, например:
Запуск горутин...
Ожидание завершения горутин...
Горутина видит i = 2
Горутина видит i = 0
Горутина видит i = 1
Все горутины завершены.


Подвох заключается в том, что код выглядит как классический пример ошибки захвата переменной цикла, но из-за изменений в языке начиная с Go 1.22, он теперь работает "правильно" без необходимости явного копирования переменной (i := i).
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Вакансии для Golang-разработчиков за последние 14 дней:

Go Developer. Удалёнка (РФ, РБ), 70–100 т.р.

Golang Developer. Удалёнка (РФ), 100–140 т.р.

C++/Go-разработчик. Гибрид (Новосибирск)

Golang Developer. Удалёнка (РФ), 150–250 т.р.

Golang Developer. Гибрид (Москва), 200–450 т.р.

Golang разработчик. Гибрид (Москва), ЗП обсуждается

Golang Developer. Гибрид/Офис (Тбилиси), 400–800 т.р.

#подборка #golang #go
🔥2
👣 Оптимизация выделения памяти в Go: как одна строчка замедлила всё на 30%

В базе данных Dolt (аналог Git, но для SQL-таблиц) после рефакторинга один из бенчмарков (types_scan) внезапно стал работать на 30% медленнее. Причина? Казалось бы, невинная строчка кода.

📉 Что произошло
Метод GetBytes() начал вызывать ReadBytes() у интерфейса ValueStore. Всё выглядело логично, пока не включили профилировщик Go и не обнаружили странную активность:
🔍 runtime.newobject вызывался слишком часто → программа делала много лишних аллокаций в куче.

📦 Где зарыта собака

func (vs nodeStore) ReadBytes(...) ...

Этот метод использовал приёмник по значению (vs nodeStore). Это значит, что вся структура копировалась при каждом вызове метода, даже если она большая.

🚑 Как пофиксили
Просто поменяли на приёмник по указателю:

func (vs *nodeStore) ReadBytes(...) ...

Вуаля — аллокейшны исчезли, производительность восстановилась.

🧠 Вывод
❗️ Методы с приёмником по значению = риск лишнего копирования и аллокаций
🛠 Даже один маленький метод может резко замедлить ваш код
🔍 Профилировка в Go — мощный инструмент. Используй pprof!

Полный разбор в блоге DoltHub
Подробнее про Dolt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
2025/07/08 23:37:34
Back to Top
HTML Embed Code: