37.1K subscribers
1.46K photos
33 videos
5 files
1.62K links
加入频道
👣 Фреймворк Google Wire: автоматическое внедрение зависимостей в Go

В статье мы обсудим один вопрос, который считается фундаментальным принципом разработки ПО и программирования в целом: внедрение зависимостей (англ. Dependency Injection, сокр. DI). Всегда полезно освежить в памяти первоосновы, поскольку они уже апробированы, проверены на практике и утверждены в качестве стандартов индустрии.

Данный материал раскрывает тему DI, акцентируя внимание на реализации этой концепции в Go. По итогам ее изучения вы получите полное понимание целей и принципов работы DI. Кроме того, вы узнаете, как именно фреймворк Wire помогает экономить время при настройке зависимостей.

Читать дальше

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Наглядная шпаргалка по основным темам в области Backend-разработки

Весь материал разбит на главы, которые включают в себя разные темы. В каждой теме можно выделить три основные части:

Визуальная часть - различные изображения/таблицы/шпаргалки для лучшего понимания (может отсутствовать). Все рисунки и таблицы сделаны с нуля, специально для этого репозитория.

Краткое описание - очень краткая выжимка информации с перечнем основных терминов и понятий. На термины навешиваются гиперссылки ведущие на соответствующий раздел в Википедии или подобном справочном ресурсе.

Ссылки на источники - ресурсы, где можно найти полную информацию по конкретному вопросу (они скрыты под спойлером, который раскрывается при нажатии). По возможности, указываются максимально авторитетные источники, либо же те, которые предоставляют информацию максимально простым и понятным языком.

Github

@Golang_google
Google Cloud Platform Go Samples

Примеры приложений и код, написанный для Google Cloud на Golang.

Github

@Golang_google
📌 Задача нахождение вершины списка.

Сложность: Средняя

Условие задачи: вершина списка - элемент, который больше как соседа слева, так и соседа справа.

Дается целочисленный массив (проиндексированный с 0), необходимо вычислить элемент, который является вершиной списка, а после вернуть его индекс. В случае нескольких таких элементов можно вернуть любой из вариантов.

Алгоритм должен иметь временную сложность O (log n).

Пример:

Ввод:
nums = [1,2,3,1]
Вывод: 2

Ввод:
nums = [1,2,1,3,5,6,4]
Вывод: 5

func findPeakElement(nums []int) int {
return findPeakRecursive(nums, 0, len(nums)-1)
}

func findPeakRecursive(nums []int, left, right int) int {
if left == right {
return right
}

midpoint := (left + right) / 2
if isPeak(nums, midpoint) {
return midpoint
}

if nums[midpoint] != 0 && nums[midpoint] < nums[midpoint+1] {
return findPeakRecursive(nums, midpoint+1, right)
}
return findPeakRecursive(nums, left, midpoint-1)
}

func isPeak(nums []int, midpoint int) bool {
if midpoint == 0 {
return nums[midpoint+1] < nums[midpoint]
}
if midpoint == len(nums)-1 {
return nums[midpoint-1] < nums[midpoint]
}
return nums[midpoint-1] < nums[midpoint] && nums[midpoint+1] < nums[midpoint]
}


Пишите свое решение в комментариях👇

@Golang_google
👣 Mailpit - тестирование электронной почты для разработчиков

Mailpit - это многоплатформенный инструмент тестирования электронной почты и API для разработчиков, написанный на Go.

Он действует как SMTP-сервер и предоставляет веб-интерфейс для просмотра писем.


🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Подборка полезных папок с каналами для датасаентисов

Папки, где вы найдете каналы с разбором лучших практик написания кода на Python и Golang до каналов по машинному обучению и нейросетям (папки работают на последних версиях тг).

https://yangx.top/addlist/MUtJEeJSxeY2YTFi - Golang

https://yangx.top/addlist/2Ls-snqEeytkMDgy - Машинное обучение

https://yangx.top/addlist/8vDUwYRGujRmZjFi - Python
🔥 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
🔥 Материалы для изучения 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
👣 LeetCode - Edit Distance

Сложность задачи: Средняя

Условие задачи:
Даны две строки 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
🔍Что выведет код ?

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
Что выведео код ?
Anonymous Quiz
44%
[1 2 5]
15%
[1 2]
38%
[1 2 0]
2%
[0 1 2 ]
👣 GoT

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, a Golang package to add context on top of Zap logger

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"
}


🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 ko - это простой и быстрый конструктор контейнерных образов для приложений Go.

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».

Провинцией является совокупность городов, объединённых между собой, но при этом отделенные от других, принадлежащих другим провинциям.

На вход даётся квадратичная матрица, в которой 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
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 - Basically A Remarkable Framework

Barf - это полезный фреймворк для создания веб-интерфейсов API на основе JSON на Golang.

go get github.com/opensaucerer/barf

Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Lit bb hack tools

Инструменты командной строки на GO, полезные для поиска багов, тестирования на проникновение и хакинга. Ориентирован на веб-цели.

golangci-lint run

GIthub

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔍Что выведет код ?

package main

import (
"fmt"
)

func main() {
x := [2]int{1, 2}
r := [...]int{1, 2}
fmt.Println(x == r)
}


Ответ

@Golang_google
Что выведет код ?
Anonymous Quiz
33%
False
44%
True
17%
Compile time error
6%
Run time error