Обычно разработчики, которые имеют большой бекграунд работы с другими ЯП, склонны использовать
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
На 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