🔥 22 библиотеки Go для повседневной работы
Список полезных и проверенных в боях библиотеках, которые вы можете использовать в своей работе.
HTTP
📌Echo / doc
📌chi / doc
Генерация сервера и клиентов Go
📌deepmap/oapi-codegen
Клиент для JavaScript/TypeScript
📌 openapi-generator-cli
Alternative types of communication
gRPC
📌protoc
Передача сообщений
📌 Watermill
Базы данных SQL
📌 sqlx
📌SQLBoiler
Migrations
📌 sql-migrate
📌 goose
Логирование
📌Logrus
📌 zap
Метрики
📌 opencensus-go
Конфиги
📌 caarlos0/env
📌 koanf
CLI
📌urfave/cli
Тестирование
📌testify
📌 go-cmp
📌gofakeit
Mocking
📌 google/uuid
📌 oklog/ulid
📌 shopspring/decimal
Обработка ошибок
📌hashicorp/go-multierror
Полезные инструменты
📌samber/lo
📌Task
Тулзы для кодинга
📌reflex
Линтеры
📌golangci-lint
📌go-cleanarch
Formatters
📌go fmt
📌goimports
📌gofumpt
Примеры проектов
DDD & Чистая архитектура
📌Wild Workouts Go DDD Example application
📌Modern Go Application by Márk Sági-Kazár
👉 Статья с разбором инструментов
@Golang_google
Список полезных и проверенных в боях библиотеках, которые вы можете использовать в своей работе.
HTTP
📌Echo / doc
📌chi / doc
Генерация сервера и клиентов Go
📌deepmap/oapi-codegen
Клиент для JavaScript/TypeScript
📌 openapi-generator-cli
Alternative types of communication
gRPC
📌protoc
Передача сообщений
📌 Watermill
Базы данных SQL
📌 sqlx
📌SQLBoiler
Migrations
📌 sql-migrate
📌 goose
Логирование
📌Logrus
📌 zap
Метрики
📌 opencensus-go
Конфиги
📌 caarlos0/env
📌 koanf
CLI
📌urfave/cli
Тестирование
📌testify
📌 go-cmp
📌gofakeit
Mocking
📌 google/uuid
📌 oklog/ulid
📌 shopspring/decimal
Обработка ошибок
📌hashicorp/go-multierror
Полезные инструменты
📌samber/lo
📌Task
Тулзы для кодинга
📌reflex
Линтеры
📌golangci-lint
📌go-cleanarch
Formatters
📌go fmt
📌goimports
📌gofumpt
Примеры проектов
DDD & Чистая архитектура
📌Wild Workouts Go DDD Example application
📌Modern Go Application by Márk Sági-Kazár
👉 Статья с разбором инструментов
@Golang_google
🔥 Материалы для изучения Docker за 10 шагов для начинающих
Шаг 1: Введение в Docker
▪Docker Documentation: Get Started with Docker
▪Docker YouTube Channel: Docker for Beginners — Full Course
Шаг 2: Работа с образами Docker
▪Docker Documentation: Working with Images
▪Docker Deep Dive eBook by Nigel Poulton: Глава 2 - Изображения
Шаг 3: Управление контейнерами Docker
▪Docker Documentation: Working with Containers
▪Docker Mastery: The Complete Toolset from a Docker Captain (Udemy Course)
Шаг 4: Тома Docker и работа с сетью
▪Docker Documentation: Using Volumes
▪Docker Documentation: Networking Overview
Шаг 5: Докеризация приложений
▪Docker Documentation: Dockerize an Application
▪Docker for Developers (Pluralsight Course)
Шаг 6: Docker Compose и оркестровка
▪Docker Documentation: Docker Compose
▪Docker Swarm Mode Introduction (YouTube)
Kubernetes Basics (Kubernetes.io)
Шаг 7: Сетевое взаимодействие и безопасность Docker
▪Docker Documentation: Networking in Compose
▪Docker Security (Docker Mastery Course)
Шаг 8: Продвинутые темы Docker
▪Docker Documentation: Healthcheck
▪Docker Logging Guide
▪Docker Monitoring Guide
Шаг 9: Развертывание Docker и CI/CD
▪Docker Documentation: Deploying Applications
▪Docker and Continuous Integration (DZone Article)
▪Docker and CI/CD with Jenkins (Medium Article)
Шаг 10: Устранение ошибок и лучшие практики работы с Docker
▪Docker Documentation: Troubleshoot Common Issues
▪Docker Best Practices (Docker Documentation)
▪Awesome Docker (GitHub Repository with curated resources)
@Golang_google
Шаг 1: Введение в Docker
▪Docker Documentation: Get Started with Docker
▪Docker YouTube Channel: Docker for Beginners — Full Course
Шаг 2: Работа с образами Docker
▪Docker Documentation: Working with Images
▪Docker Deep Dive eBook by Nigel Poulton: Глава 2 - Изображения
Шаг 3: Управление контейнерами Docker
▪Docker Documentation: Working with Containers
▪Docker Mastery: The Complete Toolset from a Docker Captain (Udemy Course)
Шаг 4: Тома Docker и работа с сетью
▪Docker Documentation: Using Volumes
▪Docker Documentation: Networking Overview
Шаг 5: Докеризация приложений
▪Docker Documentation: Dockerize an Application
▪Docker for Developers (Pluralsight Course)
Шаг 6: Docker Compose и оркестровка
▪Docker Documentation: Docker Compose
▪Docker Swarm Mode Introduction (YouTube)
Kubernetes Basics (Kubernetes.io)
Шаг 7: Сетевое взаимодействие и безопасность Docker
▪Docker Documentation: Networking in Compose
▪Docker Security (Docker Mastery Course)
Шаг 8: Продвинутые темы Docker
▪Docker Documentation: Healthcheck
▪Docker Logging Guide
▪Docker Monitoring Guide
Шаг 9: Развертывание Docker и CI/CD
▪Docker Documentation: Deploying Applications
▪Docker and Continuous Integration (DZone Article)
▪Docker and CI/CD with Jenkins (Medium Article)
Шаг 10: Устранение ошибок и лучшие практики работы с Docker
▪Docker Documentation: Troubleshoot Common Issues
▪Docker Best Practices (Docker Documentation)
▪Awesome Docker (GitHub Repository with curated resources)
@Golang_google
Сложность задачи: Средняя
Условие задачи:
Даны две строки s и t. Необходимо вернуть true, если обе они находятся на расстоянии редактирования друг от друга, в противном случае вернуть false.
Говорят, что строка s находится на расстоянии редактирования от строки t, если вы можете:
• Вставить ровно один символ в s, чтобы получить t.
• Удалить ровно один символ из s, чтобы получить t.
• Заменить ровно один символ s другим символом, чтобы получить t.
Пример:
Ввод:
s = "ab", t = "acb"
Вывод: true
Объяснение: Мы можем вставить 'c' в s, чтобы получить t.Ввод:
s = "", t = ""
Вывод: false
• Решение задачиПишите свое решение в комментариях👇
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔍Что выведет код ?
▪Ответ
@Golang_google
package main
import (
"fmt"
)
func ElementChange(x [3]int) {
x[2] = 5
}
func main() {
x := [3]int{1, 2}
ElementChange(x)
fmt.Println(x)
}
▪Ответ
@Golang_google
GoT (сокращение от Go Templates) - это гибкий механизм шаблонов, который генерирует код Go.
go install github.com/goradd/got/got@latest
▪Github
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
ZaX - это новая высокопроизводительная библиотека логирования на Go.
Она обеспечивает структурированное и многоуровневое протоколирование, при минимальных расходах на производительность.
Благодаря простому и интуитивно понятному API, Zap позволяет разработчикам легко настраивать логи по уровнями, добавлять пары ключ-значение в качестве контекста, настраивать форматы вывода журнала логов под свои нужды.
go get -u github.com/yuseferi/zax
Пример работы:
func main() {
logger, _ := zap.NewProduction()
ctx := context.Background()
s := NewServiceA(logger)
ctx = zax.Set(ctx, logger, []zap.Field{zap.String("trace_id", "my-trace-id")})
s.funcA(ctx)
}
type ServiceA struct {
logger *zap.Logger
}
func NewServiceA(logger *zap.Logger) *ServiceA {
return &ServiceA{
logger: logger,
}
}
func (s *ServiceA) funcA(ctx context.Context) {
s.logger.Info("func A") // it does not contain trace_id, you need to add it manually
zax.Get(ctx).Info("func A") // it will logged with "trace_id" = "my-trace-id"
}
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
ko идеально подходит, когда в образе одно приложение Go без множества зависимостей от (например, без cgo, без зависимостей от пакетов ОС).
ko собирает образы, выполняя go build на вашей локальной машине, и поэтому не требует установки docker. Что делает его удобным для использования CI/CD.
ko упрощает многоплатформенную сборку, создает SBOM по умолчанию и включает поддержку простых шаблонов YAML, что делает его отличным инструментом для приложений Kubernetes.
🏃 Установка ko и руководство по началу работы.
▪ Github
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Задача на систему непересекающихся множеств
Сложность: Средняя
Условие задачи: даётся n провинций, какие-то из них соединены между собой, какие-то нет, также соблюдается правило транзитивности: если провинция «1» соединена с провинцией «2», а «2» соединена с «3» провинцией, то и «1» соединена с «3».
Провинцией является совокупность городов, объединённых между собой, но при этом отделенные от других, принадлежащих другим провинциям.
На вход даётся квадратичная матрица, в которой
Необходимо вычислить количество провинций.
Пример:
Ввод:
Решается задача поиском в глубину.
Решение
Пишите свое решение в комментариях👇
@Golang_google
Сложность: Средняя
Условие задачи: даётся n провинций, какие-то из них соединены между собой, какие-то нет, также соблюдается правило транзитивности: если провинция «1» соединена с провинцией «2», а «2» соединена с «3» провинцией, то и «1» соединена с «3».
Провинцией является совокупность городов, объединённых между собой, но при этом отделенные от других, принадлежащих другим провинциям.
На вход даётся квадратичная матрица, в которой
isConnected[i][j] = 1 -
соединение между i - ым и j - - ым населенными пунктами (1 - имеется соединение, 0 - отсутствует). Необходимо вычислить количество провинций.
Пример:
Ввод:
isConnected = [[1,1,0],[1,1,0],[0,0,1]]
Вывод: 2
Решается задача поиском в глубину.
Решение
Пишите свое решение в комментариях👇
@Golang_google
Вызов функций 👣 из 🖥
Недавно предо мной встала задача вызова функций Go из C#. В этом посте я решил поделиться простыми примерами кода, которые возможно вам пригодятся.
Для этого я сгенерировал файл Go dll и вызывал его из C#.
Вызов со значениями int
[C#] CallSample.cs
[Go] main.go
🗂Создайте файл dll
📢Вызов со строковыми значениями
Поскольку строковый тип C# и строковый тип Go несовместимы, мы получим исключение.
[C#] CallSample.cs
[Go] main.go
Результат
Чтобы решить эту проблему, нужно использовать “C.char”.
[C#] CallSample.cs
[Go] main.go
📢Вызов с помощью массивов
Чтобы отправить массив int в функцию Go, нужно преобразовать его в IntPtr.
А чтобы получить массив int из функции Go, нужно преобразовать его из IntPtr.
[C#] CallSample.cs
[Go] main.go
▪Читать
▪Изучение C#
@Golang_google
Недавно предо мной встала задача вызова функций Go из C#. В этом посте я решил поделиться простыми примерами кода, которые возможно вам пригодятся.
Для этого я сгенерировал файл Go dll и вызывал его из C#.
Вызов со значениями int
[C#] CallSample.cs
using System.Runtime.InteropServices;
namespace CallDllSample;
public class CallSample
{
[DllImport("dllsample")]
private static extern int CallInt(int num);
public int CallGoInt(int num)
{
return CallInt(num);
}
}
[Go] main.go
package main
import "C"
func main() { }
// publish functions by "//export ~"
//export CallInt
func CallInt(num int) int {
return num + 3
}
🗂Создайте файл dll
go build -buildmode=c-shared -o dllsample.dll .
📢Вызов со строковыми значениями
Поскольку строковый тип C# и строковый тип Go несовместимы, мы получим исключение.
[C#] CallSample.cs
...
[DllImport("dllsample")]
private static extern string CallString(string text);
...
public string CallGoString(string text)
{
return CallString(text);
}
}
[Go] main.go
...
func CallString(text string) string {
return fmt.Sprintf("%s World!", text)
}
Результат
Fatal error. System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Чтобы решить эту проблему, нужно использовать “C.char”.
[C#] CallSample.cs
...
[DllImport("dllsample")]
private static extern IntPtr CallString(string text);
...
public string CallGoString(string text)
{
var result = CallString(text);
Console.WriteLine(result);
return Marshal.PtrToStringAnsi(result) ?? "";
}
}
[Go] main.go
...
//export CallString
func CallString(text *C.char) *C.char {
gs := C.GoString(text)
return C.CString(fmt.Sprintf("%s World!", gs))
}
📢Вызов с помощью массивов
Чтобы отправить массив int в функцию Go, нужно преобразовать его в IntPtr.
А чтобы получить массив int из функции Go, нужно преобразовать его из IntPtr.
[C#] CallSample.cs
...
public void CallGoArray()
{
// Convert from C# int array to IntPtr
var nums = new int[]{ 4, 2, 5, 8 };
IntPtr intPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(int)) * nums.Length);
Marshal.Copy(nums, 0, intPtr, nums.Length);
var pointerResult = CallArray(intPtr, nums.Length);
// Convert from IntPtr to C# int array
var results = new int[nums.Length];
Marshal.Copy(pointerResult, results, 0, results.Length);
for(var i = 0; i < results.Length; i++)
{
Console.WriteLine($"From Go Index: {i} Value: {results[i]}");
}
}
...
[Go] main.go
...
//export CallArray
func CallArray(values *C.int, length C.int) *C.int {
// Convert from C int array to Go int array
cInts := (*[1 << 30]C.int)(unsafe.Pointer(values))[:length:length]
goResults := make([]int, int(length))
for i, v := range cInts {
goResults[i] = int(v)
log.Printf("From C# Index: %d Value: %d", int(i), int(v))
}
// Convert from Go int array to C int array
results := C.malloc(C.size_t(length) * C.size_t(unsafe.Sizeof(uintptr(0))))
pointerResult := (*[1 << 30]C.int)(results)
for i := 0; i < int(length); i++ {
pointerResult[i] = C.int(goResults[i] + 2)
}
return (*C.int)(results)
}
▪Читать
▪Изучение C#
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Barf - это полезный фреймворк для создания веб-интерфейсов API на основе JSON на Golang.
go get github.com/opensaucerer/barf
▪ Github
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Инструменты командной строки на GO, полезные для поиска багов, тестирования на проникновение и хакинга. Ориентирован на веб-цели.
golangci-lint run
▪ GIthub
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔍Что выведет код ?
Ответ
@Golang_google
package main
import (
"fmt"
)
func main() {
x := [2]int{1, 2}
r := [...]int{1, 2}
fmt.Println(x == r)
}
Ответ
@Golang_google
⏱Openjob: best distributed task scheduling framework
Openjob - это распределенная и высокопроизводительная система планирования задач на Go, которая поддерживает множество cronjob.
▪Github
▪Проект
▪Demo
@Golang_google
Openjob - это распределенная и высокопроизводительная система планирования задач на Go, которая поддерживает множество cronjob.
▪Github
▪Проект
▪Demo
@Golang_google
WebPalm - это мощный инструмент командной строки на GO для создания карт веб-сайтов и веб-скреппинга. Благодаря рекурсивному подходу он может создать полное дерево всех веб-страниц и ссылок на них на сайте.
Он также может извлекать данные из тела каждой страницы с помощью регулярных выражений, что делает его идеальным инструментом для веб-скрейпинга и извлечения данных.
▪ Github
@Golang_google
Он также может извлекать данные из тела каждой страницы с помощью регулярных выражений, что делает его идеальным инструментом для веб-скрейпинга и извлечения данных.
go install github.com/XORbit01/webpalm@latest
▪ Github
@Golang_google
Как завершить работу Горутин
в Go: Эффективные методы и примеры
Пишите свои примеры завершения Горутин с кодом в комментариях 👇
@Golang_google
в Go: Эффективные методы и примеры
Пишите свои примеры завершения Горутин с кодом в комментариях 👇
@Golang_google