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
На GitHub под лицензией Apache License 2.0 опубликован проект под названием Nuke v1.1.0. Это реализация арены памяти для Go с бенчмарками и даже реализацией параллельной арены.
Арена памяти — это метод управления памятью, при котором сразу выделяется большой блок памяти, а его части используются для удовлетворения запросов выделения от программы. В контексте языка со сборкой мусора, такого как Go, использование арен памяти может дать несколько преимуществ:
Однако, хотя арены памяти предлагают эти преимущества, они не являются панацеей и имеют свои недостатки, такие как потенциальное увеличение использования памяти из-за неиспользуемого пространства внутри выделенных блоков. Необходимо тщательное рассмотрение и профилирование, чтобы определить, полезно ли использование арены памяти для конкретного приложения.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Сервис, который предоставляет полностью открытую платформу с сквозным шифрованием, позволяющую хранить ваши данные в облаке без необходимости доверять поставщику услуг.
Альтернатива ва Google Photos и Apple Photos.
#golang #backend
▪Github
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
С его помощью можно добавлять возможность комментирования к любым статическим страницам, вставив лишь пару HTML-тегов.
Comentario написан на Go и Angular и использует БД PostgreSQL для хранения комментариев.
Возможности и фичи:
Пользуйтесь)
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥Подборка лучших обучающих каналов для программистов.
➡️ Делитесь с коллегами и cохраняйте себе, чтобы не потерять
⚡️ Frontend
Javascript академия - крупнейший js канал
React - лучшие гайды и советы по работе с react
Frontend - тутрориалы, уроки, гайды, код
PHP
Книги frontend
Задачи frontend
💥 Хакинг Kali Linux
Kali linux
linux_kal - kali чат
Информационная безопасность
🚀 Data Science
Анализ данных - полезные фишки, код, гайды и советы, маст-хэв датасаентиста
Data Jobs - ds вакансии
Аналитик данных
Data Science книги - актуальные бесплатные книги
Big data
#️⃣C#
С# академия
С# заметки — код, лучшие практики, заметки программиста c#
С# задачи и тесты
С# библиотека - актуальные бесплатные книги
C# вакансии - работа
⚡Машинное обучение
Ml Собеседование - подготовка к собеседовению мл, алгоритмам, кодингу
Ml ru - актуальные статьи, новости, код и обучающие материалы
Ml Jobs - вакансии ML
ML Книги - актуальные бесплатные книги МО
ML чат
Machine Learning - полезные статьи новости гайды и разбор кода
🏆 Golang
Golang - подробные гайды, разбор кода, лучшие практики, заметки
Golang собеседование
Golang вакансии
Golang книги
Golang задачи и тесты
Golang чат
Golang news - новости go
🐍 Python
Python/django
Python Собеседование - подготовка к собеседовению python и разбор алгоритмов
Pro python - статьи, новости, код и обучающие материалы
Python Jobs - вакансии Python
Python чат
Python книги
☕ Java
Java академия
Java вакансии
Java чат
Java вопросы с собеседований
Java книги
🛢Базы данных
Sql базы данных
Библиотека баз данных
SQL чат
💻 C++
C++ академия
С++ книги
C++ задачи - подготовка к собеседовению мл, алгоритмам
C++ вакансии
🐧 Linux
Linux academy
🦀 Rust
Rust программирование
Rust чат
Rust книги для программистов
📲 Мобильная разработка
Android разработка
Мобильный разработчик гайды и уроки
🇬🇧 Английский для программистов
🧠 Искусственный интеллект
ИИ и технологии
Neural - нейросети для работы и жизни
Книги ИИ
Artificial Intelligence
🔥 DevOPs
Devops для программистов
Книги Devops
🌟 Docker/Kubernets
Docker
Kubernets
📓 Книги
Библиотеки Книг для программситов
💼 Папка с вакансиями:
Папка Go разработчика:
Папка Python разработчика:
Папка Data Science
Папка Java разработчика
Папка C#
Папка Frontend
➡️ Делитесь с коллегами и cохраняйте себе, чтобы не потерять
⚡️ Frontend
Javascript академия - крупнейший js канал
React - лучшие гайды и советы по работе с react
Frontend - тутрориалы, уроки, гайды, код
PHP
Книги frontend
Задачи frontend
💥 Хакинг Kali Linux
Kali linux
linux_kal - kali чат
Информационная безопасность
🚀 Data Science
Анализ данных - полезные фишки, код, гайды и советы, маст-хэв датасаентиста
Data Jobs - ds вакансии
Аналитик данных
Data Science книги - актуальные бесплатные книги
Big data
#️⃣C#
С# академия
С# заметки — код, лучшие практики, заметки программиста c#
С# задачи и тесты
С# библиотека - актуальные бесплатные книги
C# вакансии - работа
⚡Машинное обучение
Ml Собеседование - подготовка к собеседовению мл, алгоритмам, кодингу
Ml ru - актуальные статьи, новости, код и обучающие материалы
Ml Jobs - вакансии ML
ML Книги - актуальные бесплатные книги МО
ML чат
Machine Learning - полезные статьи новости гайды и разбор кода
🏆 Golang
Golang - подробные гайды, разбор кода, лучшие практики, заметки
Golang собеседование
Golang вакансии
Golang книги
Golang задачи и тесты
Golang чат
Golang news - новости go
🐍 Python
Python/django
Python Собеседование - подготовка к собеседовению python и разбор алгоритмов
Pro python - статьи, новости, код и обучающие материалы
Python Jobs - вакансии Python
Python чат
Python книги
☕ Java
Java академия
Java вакансии
Java чат
Java вопросы с собеседований
Java книги
🛢Базы данных
Sql базы данных
Библиотека баз данных
SQL чат
💻 C++
C++ академия
С++ книги
C++ задачи - подготовка к собеседовению мл, алгоритмам
C++ вакансии
🐧 Linux
Linux academy
🦀 Rust
Rust программирование
Rust чат
Rust книги для программистов
📲 Мобильная разработка
Android разработка
Мобильный разработчик гайды и уроки
🇬🇧 Английский для программистов
🧠 Искусственный интеллект
ИИ и технологии
Neural - нейросети для работы и жизни
Книги ИИ
Artificial Intelligence
🔥 DevOPs
Devops для программистов
Книги Devops
🌟 Docker/Kubernets
Docker
Kubernets
📓 Книги
Библиотеки Книг для программситов
💼 Папка с вакансиями:
Папка Go разработчика:
Папка Python разработчика:
Папка Data Science
Папка Java разработчика
Папка C#
Папка Frontend
rune
и byte
— в чём разница?rune
- это 32-х битный тип, представляющий юникодные символы в кодировке UTF-32 aka UCS-4.byte
- это универсальный 8-битный тип.rune
используется для работы с не-ASCII символами в строках. Есть встроенное приведение []rune
для типа string
, которое парсит строку из UTF-8
(представление с переменной длиной байтов) в представление с фиксированной длиной байтов.[]byte(str)
и []rune(str)
разительна. Строка Привет, мир!
:Байты: [208 159 209 128 208 184 208 178 208 181 209 130 44 32 208 188 208 184 209 128 33]
Руны: [1055 1088 1080 1074 1077 1090 44 32 1084 1080 1088 33]
[]rune(string)
эквивалентно вот такой функции:func ToRunes(bytes []byte) []rune {
result := []rune{}
for i := 0; i < len(bytes); {
r, size := utf8.DecodeRune(bytes[i:])
result = append(result, r)
i += size
}
return result
}
Привет, мир!
в руны и обратно@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
kubent
) — инструмент для проверки использования устаревших API в кластере KubernetesОсобенно это актуально сейчас, на фоне распространения Kubernetes 1.16, многие API становятся устаревшими.
kubent
без проблем работает: — с
YAML
или JSON
— с
kubectl
, используется аннотация kubectl.kubernetes.io/last-applied-configuration
— с Helm v3
kubent
:sh -c "$(curl -sSL https://git.io/install-kubent)"
ну или
brew install kubent
-h
, как обычно:./kubent -h
Usage of ./kubent:
-A, --additional-annotation strings additional annotations that should be checked to determine the last applied config
-a, --additional-kind strings additional kinds of resources to report in Kind.version.group.com format
-c, --cluster enable Cluster collector (default true)
-x, --context string kubeconfig context
-e, --exit-error exit with non-zero code when issues are found
-f, --filename strings manifests to check, use - for stdin
--helm3 enable Helm v3 collector (default true)
-k, --kubeconfig string path to the kubeconfig file
-l, --log-level string set log level (trace, debug, info, warn, error, fatal, panic, disabled) (default "info")
-o, --output string output format - [text|json|csv] (default "text")
-O, --output-file string output file, use - for stdout (default "-")
-t, --target-version string target K8s version in SemVer format (autodetected by default)
-v, --version prints the version of kubent and exits
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Ловите — самые востребованные команды Docker
Освежите эту важную информацию, чтобы она переместилась в долговременную память)
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM