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
Иногда немного меток и
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
⚡️ Gosseract OCR
Библиотека компьютерного зрения на
▪Github
@Golang_google
Библиотека компьютерного зрения на
Go
для оптического распознавания символов (OCR), использующая библиотеку Tesseract C++▪Github
@Golang_google
Он компилируется в SQL и делает написание сложных SQL-запросов простым и интуитивно понятным.
Как и SQL, данный язык удобочитаемый, явный и декларативный. При этом в отличие от используемого всеми стандарта, PRQL формирует логический конвейер преобразований и поддерживает такие абстракции, как переменные и функции
Разработчики языка с самого старта решили для себя, что их проект будет всегда иметь открытый исходный код и никогда не получит коммерческого варианта. Это делает его ещё более интересным
Основные преимущества
PRQL
заключаются в его концепции линейных трансформаций данных, что делает язык легким для чтения и написанияPRQL
поддерживает современные функции, такие как даты, диапазоны, f-строки, а также функции, проверку типов и улучшенную обработку null-значенийhttps://prql-lang.org
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
𝗧𝗿𝗶𝘃𝘆
— это инструмент от Aqua Security для поиска уязвимостей и ошибок неправильных настроек
𝗦𝗲𝗮𝗹𝗲𝗱 𝗦𝗲𝗰𝗿𝗲𝘁𝘀
— интегрируется в Kubernetes, позволяя расшифровывать конфиденциальные данные только контроллеру Kubernetes, запущенному в Kubernetes, и больше никому. Контроллер расшифрует данные и создаст собственные секреты K8s, которые будут надежно сохранены.
𝗧𝗲𝗿𝗿𝗮𝘀𝗰𝗮𝗻
— статический опенсорсный анализатор кода, созданный на основе OPA. Terrascan может проявлять уязвимость безопасности и нарушение нормативных требований. Инструмент имеет более 500 политик, которые помогают обеспечить надежность для различных программ
𝗞𝘂𝗯𝗲𝗔𝗿𝗺𝗼𝗿
— это система обеспечения безопасности среды выполнения контейнеров, которая ограничивает поведение (например, выполнение процессов, доступ к файлам, сетевые операции и использование ресурсов) контейнеров на системном уровне.
Пользуйтесь)
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Обычно разработчики, которые имеют большой бекграунд работы с другими ЯП, склонны использовать
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
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
▪Github
#golang #программирование
go install github.com/PeronGH/cli2ssh/cmd/cli2ssh@latest
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Предположим что у нас есть два коннекта к базе (одной или нескольким, это не важно). Далее используя
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
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
❄️ Polaris
Новейший легкий инструмент для организации рабочего процесса для Golang.
Когда этот фреймворк будет полезен;
▪Если ваши системы работают с повторно используемыми компонентами, которые можно комбинировать различными способами для получения разных конечных результатов.
▪Если у вас в прогрмме происходит многоэтапное выполнение рабочего процесса, где каждый шаг зависит от данных, сгенерированных на предыдущих шагах.
▪Если ваши рабочие процессы могут быть приостановлены, возобновлены или даже перезапущены с самого начала.
@Golang_google
Новейший легкий инструмент для организации рабочего процесса для Golang.
Когда этот фреймворк будет полезен;
▪Если ваши системы работают с повторно используемыми компонентами, которые можно комбинировать различными способами для получения разных конечных результатов.
▪Если у вас в прогрмме происходит многоэтапное выполнение рабочего процесса, где каждый шаг зависит от данных, сгенерированных на предыдущих шагах.
▪Если ваши рабочие процессы могут быть приостановлены, возобновлены или даже перезапущены с самого начала.
go get github.com/harshadmanglani/[email protected]
▪ Github@Golang_google
Простая библиотека 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
🐕 Выпущены версии Go 1.22.1 и 1.21.8!
🔐 Безопасность: Включает исправления безопасности для crypto / x509, html/template, net/http, net/http/cookiejar и net/mail.
📣 Анонс: https://groups.google.com/g/golang-announce/c/5pwGVUPoMbg
⬇️ Скачать: https://go.dev/dl/#go1.22.1
#golang
@Golang_google
🔐 Безопасность: Включает исправления безопасности для crypto / x509, html/template, net/http, net/http/cookiejar и net/mail.
📣 Анонс: https://groups.google.com/g/golang-announce/c/5pwGVUPoMbg
⬇️ Скачать: https://go.dev/dl/#go1.22.1
#golang
@Golang_google
Более 10 лет гоферы жаловались на отсутствие структурированного логирования в ядре Golang.
В 2023 году, команда Go наконец-то представила
slog
— высокопроизводительный пакет для структурированного ведения логов в стандартной библиотеке Go.log/slog
предоставляет 3 основных типа:Logger
: это "фронтэнд" логгирования; предоставляет методы уровня (Info()
и Error()
) для записи событий.Record
: представление каждого автономного объекта журнала, созданного Logger
.Handler
: интерфейс, который определяет форматирование и назначение каждого Record
. В пакет log/slog
включены два встроенных обработчика: TextHandler
и JSONHandler
для вывода данных в формате key=value
и JSON соответственно.Пакет
slog
предоставляет стандартный Logger
, доступный через функции верхнего уровня. Этот логер выводит почти такой же результат, как и старый метод log.Printf()
, за исключением включения уровней журнала:package main
import (
"log"
"log/slog"
)
func main() {
log.Print("Info")
slog.Info("Info")
}
// 2099/09/09 23:59:59 Info
// 2099/09/09 23:59:59 INFO Info
Выглядит странно, учитывая, что основная цель
slog
— привнести структурирование логов.Это легко исправить, создав экземпляр
Logger
с помощью slog.New()
. Он принимает реализацию Handler
, который определяет, как будут отформатированы журналы и куда будут записаны.Вот мы выводим JSON-логи в
stdout
при помощи встроенного JSONHandler
:func main() {
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Debug("Debug")
logger.Info("Info")
logger.Warn("Warning")
logger.Error("Error")
}
// {"time":"2099-09-15T12:59:59.227408691+09:00","level":"INFO","msg":"Info"}
// {"time":"2099-09-15T12:59:59.227468972+09:00","level":"WARN","msg":"Warning"}
// {"time":"2099-09-15T12:59:59.227472149+09:00","level":"ERROR","msg":"Error"}
slog
подробнее @Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
go quite
- это библиотека Go для постоянной очереди сообщений, построенная на SQLite и вдохновленная AWS SQS (но намного более простая).Особенности
▪Сообщения сохраняются в таблице SQLite.
▪Сообщения отправляются в очередь и принимаются из нее и гарантированно не будут доставлены повторно до истечения времени ожидания.
▪Поддержка нескольких очередей в одной таблице.
▪Время ожидания сообщений может быть увеличено, например, для поддержки длительно выполняющихся задач.
▪Встроенный обработчик HTTP.
📌 Github
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM