📚Библиотеки и инструменты для создания и отправки электронной почты на 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_google
▪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_google
👍23🔥9❤2👏1
В любом хорошо структурированном коде большая часть функциональности разбита на небольшие многократно используемые функции.
Юнит-тестирование - это практика проверки этих функций с различными входными данными, чтобы убедиться, что они возвращают ожидаемые результаты во всех случаях.
Такой подход повышает общее качество кода за счет продуманного дизайна API.
Эти тесты обычно автоматизируются и используются для того, чтобы их можно было выполнять многократно.
В этом посте вы узнаете, как реализовать модульные тесты в Go с помощью встроенного в него модуля для тестирования.
К концу этой статьи вы узнаете:
▪Возможности тестирования стандартной библиотеки Go.
▪Как запускать и интерпретировать результаты тестирования.
▪Как решать проблемы неудачных тестов.
▪Как создавать и анализировать отчеты о работе кода.
📌 Статья
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤3🔥3
var endBlock int
row := db.QueryRow(ctx, `select relpages from pg_class where oid = 'table1'::regclass::oid`)
err = row.Scan(&endBlock)
if err != nil {
return
}
startBlock := 0
blocksPerIteration := 50
maxTuplesPerBlock := 150
for {
var rows pgx.Rows
rows, err = db.Query(ctx, `
select id
from table1
where ctid = any (
array(
select format('(%s, %s)', a, b)::tid
from generate_series($1::int, $2::int) a(a)
cross join generate_series(0, $3) b(b)
))
and value = '100000'`,
startBlock,
startBlock+blocksPerIteration,
maxTuplesPerBlock,
)
if err != nil {
return
}
var id int
for rows.Next() {
err = rows.Scan(&id)
if err != nil {
return
}
slog.Info("found row", "id", id)
}
rows.Close()
startBlock += blocksPerIteration
if startBlock > endBlock {
break
}
time.Sleep(100 * time.Millisecond)
}
Некоторые нюансы:
— из-за того что тип
tid
не оптимизирует операции больше/меньше, приходится использовать ctid = any (...)
— для определения
maxTuplesPerBlock
можно использовать запросselect 8096 / min(x)
from (
select pg_column_size(table1) x
from table1 tablesample system(1)
) d
— можно делать не только
select
, но и update
и delete
, но помнить что строки могут и перемещаются как внутри блока, так и между ними@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤6🔥5
В Go отсутствует эргономичная идиоматическая библиотека утилит для итераторов. Пакет построен на основе (rangefunc experiment)[https://go.dev/wiki/RangefuncExperiment] для go 1.22.
▪Github
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👎30❤8👍5🔥5🤔3
Wire — это мощный инструмент для кодогенерации, позволяет обнаруживать проблемы с графом зависимостей во время компиляции.
Преимуществом Wire является то, что контейнер конфигурируется не с помощью каких-то специальных файлов, а непосредственно с помощью кода Go.
Wire основан на 2 понятиях — провайдерах и инжекторах. Программист описывает функцию-инжектор на Go-совместимом языке Wire, декларируя функции-провайдеры, а Wire на основе описания генерирует реальный код инжектора, эти провайдеры использующий.
Установка Wire очень проста:
go install github.com/google/wire/cmd/wire@latest
(убедитесь, что
$GOPATH/bin
добавлена в переменную среды $PATH
)@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2🔥2👎1
Иногда немного меток и
goto
в Go очень кстати, не бойтесь использовать, если это действительно удобноДовольно много разработчиков боятся
goto
как огня, зная «О вреде оператора Go To» от Дейкстры, но важно правильно понимать посыл той статьи и контекстКстати, статья в тему — "О вреде GOTO-фобии"
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👎44👍10❤5🤔3🥰1
⚡️ Gosseract OCR
Библиотека компьютерного зрения на
▪Github
@Golang_google
Библиотека компьютерного зрения на
Go
для оптического распознавания символов (OCR), использующая библиотеку Tesseract C++▪Github
@Golang_google
🔥12❤6👍6
Он компилируется в SQL и делает написание сложных SQL-запросов простым и интуитивно понятным.
Как и SQL, данный язык удобочитаемый, явный и декларативный. При этом в отличие от используемого всеми стандарта, PRQL формирует логический конвейер преобразований и поддерживает такие абстракции, как переменные и функции
Разработчики языка с самого старта решили для себя, что их проект будет всегда иметь открытый исходный код и никогда не получит коммерческого варианта. Это делает его ещё более интересным
Основные преимущества
PRQL
заключаются в его концепции линейных трансформаций данных, что делает язык легким для чтения и написанияPRQL
поддерживает современные функции, такие как даты, диапазоны, f-строки, а также функции, проверку типов и улучшенную обработку null-значенийhttps://prql-lang.org
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👎20👍9🔥7❤3
𝗧𝗿𝗶𝘃𝘆
— это инструмент от Aqua Security для поиска уязвимостей и ошибок неправильных настроек
𝗦𝗲𝗮𝗹𝗲𝗱 𝗦𝗲𝗰𝗿𝗲𝘁𝘀
— интегрируется в Kubernetes, позволяя расшифровывать конфиденциальные данные только контроллеру Kubernetes, запущенному в Kubernetes, и больше никому. Контроллер расшифрует данные и создаст собственные секреты K8s, которые будут надежно сохранены.
𝗧𝗲𝗿𝗿𝗮𝘀𝗰𝗮𝗻
— статический опенсорсный анализатор кода, созданный на основе OPA. Terrascan может проявлять уязвимость безопасности и нарушение нормативных требований. Инструмент имеет более 500 политик, которые помогают обеспечить надежность для различных программ
𝗞𝘂𝗯𝗲𝗔𝗿𝗺𝗼𝗿
— это система обеспечения безопасности среды выполнения контейнеров, которая ограничивает поведение (например, выполнение процессов, доступ к файлам, сетевые операции и использование ресурсов) контейнеров на системном уровне.
Пользуйтесь)
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥4❤2
Обычно разработчики, которые имеют большой бекграунд работы с другими ЯП, склонны использовать
assert
для выявления неожиданных входных данных. В целом, это оправданно, особенно, если мы планируем покрывать проект тестами. Хмм, а что, если просто выкидывать панику, когда есть риск неправильно обработать входные данные? Здесь в коде показано, как это может выглядеть; есть
Assert
, который возвращает ошибку с перечислением всех неудачных утверждений, и есть MustAssert
, который выкидывает панику. Код вдохновлён tigerbeetle Что думаете по этому поводу?
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👎12👍6❤3😁3🤬3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Полезный инструмент, написанный на Go, для
выгрузки/загрузки
данных с большинства основных СУБД включая облачные, файловых систем и различных файлов данных. ▪Github
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍9❤4
▪Github
#golang #программирование
go install github.com/PeronGH/cli2ssh/cmd/cli2ssh@latest
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥2🤔2❤1👎1
Предположим что у нас есть два коннекта к базе (одной или нескольким, это не важно). Далее используя
io.Pipe()
создаём Reader
и Writer
, и используя CopyTo()
и CopyFrom()
переносим данные.r, w := io.Pipe()
doneChan := make(chan struct{}, 1)
go func() {
defer close(doneChan)
_, err := db1.PgConn().CopyTo(ctx, w, `copy table1 to stdin binary`)
if err != nil {
slog.Error("error", "error", err)
return
}
_ = w.Close()
doneChan <- struct{}{}
}()
_, err = db2.PgConn().CopyFrom(ctx, r, `copy table1 from stdout binary`)
_ = r.Close()
select {
case <-doneChan:
case <-ctx.Done():
}
Вся прелесть тут в том что используем наиболее быстрый способ с точки зрения PostgreSQL.
Используя `copy (select * from where ... order by ... limit ...) to stdout `можем регулировать нагрузку на чтение, следить за прогрессом и управлять копированием данных.
В качестве
Reader
может выступать что угодно, хоть файл csv, хоть другая СУБД, но тогда данные придётся дополнительно конвертировать в формат понимаемый PostgreSQL - csv или tsv, и использовать copy ... from stdin (format csv)
.Нюанс:
copy ... from stdin binary
, binary
обязывает использовать одинаковые типы данных, нельзя будет integer
колонку перенести в колонку smallint
, если такое требуется, то параметр binary
надо опустить.Весь код тут. И ещё немного кода для вдохновения.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍28🔥5🤔3❤2😱2
range func
— это функция-итератор, которую можно использовать в for-range
цикле. Функция позволяет проходиться по какому-либо множеству данных, конечному или бесконечному.Как с этим дела сейчас?
For-range
циклы на данный момент позволяют следующее (в плане итерирования по коллекциям):for i, v := range []int{2, 4, 6} {...}
for k, v := range map[string]int{“two”: 2, “four”: 4, “six”: 6} {...}
На этом все. Если вам нужно итерироваться как-то иначе, то используйте обычный for цикл. Различные библиотеки решают этот вопрос по-разному.
И вот тут можно использовать итераторы, чтобы создавать нужный порядок обхода набора.
Например, задача: проитерироваться по слайсу с конца. Ничего сложного, типичная схема.
s := []int{2, 4, 6}
for i := len(s)-1; i >= 0; i-- {
// ...
}
Вот было круто вообще все слайсы проходить с конца. Используем итератор — и вуаля:
type Iter[E any] func(body func(index int, value E))
func Backward[S ~[]E, E any](s S) Iter[E] {
return func(body func(int, E)) {
for i := len(s) - 1; i >= 0; i-- {
body(i, s[i])
}
}
}
// Использование
backwardIter := Backward([]int{2, 4, 6})
backwardIter(func(index int, value int) {
fmt.Printf("[%d]=%d\n", index, value)
})
Вообще, итераторы могут стать очень полезной фичой, если в вашем проекте часто всплывают похожие задачи
Подробнее про итераторы можно почитать тут
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🔥4❤3
❄️ Polaris
Новейший легкий инструмент для организации рабочего процесса для Golang.
Когда этот фреймворк будет полезен;
▪Если ваши системы работают с повторно используемыми компонентами, которые можно комбинировать различными способами для получения разных конечных результатов.
▪Если у вас в прогрмме происходит многоэтапное выполнение рабочего процесса, где каждый шаг зависит от данных, сгенерированных на предыдущих шагах.
▪Если ваши рабочие процессы могут быть приостановлены, возобновлены или даже перезапущены с самого начала.
@Golang_google
Новейший легкий инструмент для организации рабочего процесса для Golang.
Когда этот фреймворк будет полезен;
▪Если ваши системы работают с повторно используемыми компонентами, которые можно комбинировать различными способами для получения разных конечных результатов.
▪Если у вас в прогрмме происходит многоэтапное выполнение рабочего процесса, где каждый шаг зависит от данных, сгенерированных на предыдущих шагах.
▪Если ваши рабочие процессы могут быть приостановлены, возобновлены или даже перезапущены с самого начала.
go get github.com/harshadmanglani/[email protected]
▪ Github@Golang_google
👍8❤6🔥2
Простая библиотека GO для вывода любых переменных GO в структурированном виде в цвете.
go get -u github.com/yassinebenaid/godump
▪Github
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍33😁4❤3🔥3