В статье мы обсудим один вопрос, который считается фундаментальным принципом разработки ПО и программирования в целом: внедрение зависимостей (англ. Dependency Injection, сокр. DI). Всегда полезно освежить в памяти первоосновы, поскольку они уже апробированы, проверены на практике и утверждены в качестве стандартов индустрии.
Данный материал раскрывает тему DI, акцентируя внимание на реализации этой концепции в Go. По итогам ее изучения вы получите полное понимание целей и принципов работы DI. Кроме того, вы узнаете, как именно фреймворк Wire помогает экономить время при настройке зависимостей.
▪Читать дальше
@Golang_google
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👎13👍6❤2🔥1
  ⚡ Наглядная шпаргалка по основным темам в области Backend-разработки
Весь материал разбит на главы, которые включают в себя разные темы. В каждой теме можно выделить три основные части:
▪Визуальная часть - различные изображения/таблицы/шпаргалки для лучшего понимания (может отсутствовать). Все рисунки и таблицы сделаны с нуля, специально для этого репозитория.
▪Краткое описание - очень краткая выжимка информации с перечнем основных терминов и понятий. На термины навешиваются гиперссылки ведущие на соответствующий раздел в Википедии или подобном справочном ресурсе.
▪Ссылки на источники - ресурсы, где можно найти полную информацию по конкретному вопросу (они скрыты под спойлером, который раскрывается при нажатии). По возможности, указываются максимально авторитетные источники, либо же те, которые предоставляют информацию максимально простым и понятным языком.
▪Github
@Golang_google
Весь материал разбит на главы, которые включают в себя разные темы. В каждой теме можно выделить три основные части:
▪Визуальная часть - различные изображения/таблицы/шпаргалки для лучшего понимания (может отсутствовать). Все рисунки и таблицы сделаны с нуля, специально для этого репозитория.
▪Краткое описание - очень краткая выжимка информации с перечнем основных терминов и понятий. На термины навешиваются гиперссылки ведущие на соответствующий раздел в Википедии или подобном справочном ресурсе.
▪Ссылки на источники - ресурсы, где можно найти полную информацию по конкретному вопросу (они скрыты под спойлером, который раскрывается при нажатии). По возможности, указываются максимально авторитетные источники, либо же те, которые предоставляют информацию максимально простым и понятным языком.
▪Github
@Golang_google
🔥16👍9❤1🥰1
  ⚡ Google Cloud Platform Go Samples
Примеры приложений и код, написанный для Google Cloud на Golang.
▪Github
@Golang_google
Примеры приложений и код, написанный для Google Cloud на Golang.
▪Github
@Golang_google
👍9🔥3❤1
  📌 Задача нахождение вершины списка.
Сложность: Средняя
Условие задачи: вершина списка - элемент, который больше как соседа слева, так и соседа справа.
Дается целочисленный массив (проиндексированный с 0), необходимо вычислить элемент, который является вершиной списка, а после вернуть его индекс. В случае нескольких таких элементов можно вернуть любой из вариантов.
Алгоритм должен иметь временную сложность O (log n).
Пример:
Ввод:
Вывод:
Ввод:
Вывод:
Пишите свое решение в комментариях👇
@Golang_google
Сложность: Средняя
Условие задачи: вершина списка - элемент, который больше как соседа слева, так и соседа справа.
Дается целочисленный массив (проиндексированный с 0), необходимо вычислить элемент, который является вершиной списка, а после вернуть его индекс. В случае нескольких таких элементов можно вернуть любой из вариантов.
Алгоритм должен иметь временную сложность O (log n).
Пример:
Ввод:
nums = [1,2,3,1]Вывод:
2 Ввод:
nums = [1,2,1,3,5,6,4]Вывод:
5func 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
👍6👎5🔥3❤1
  Mailpit - это многоплатформенный инструмент тестирования электронной почты и API для разработчиков, написанный на Go.
Он действует как SMTP-сервер и предоставляет веб-интерфейс для просмотра писем.
@Golang_google
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍19❤4🔥2
  🔥 Подборка полезных папок с каналами для датасаентисов
Папки, где вы найдете каналы с разбором лучших практик написания кода на Python и Golang до каналов по машинному обучению и нейросетям (папки работают на последних версиях тг).
https://t.iss.one/addlist/MUtJEeJSxeY2YTFi - Golang
https://t.iss.one/addlist/2Ls-snqEeytkMDgy - Машинное обучение
https://t.iss.one/addlist/8vDUwYRGujRmZjFi - Python
Папки, где вы найдете каналы с разбором лучших практик написания кода на Python и Golang до каналов по машинному обучению и нейросетям (папки работают на последних версиях тг).
https://t.iss.one/addlist/MUtJEeJSxeY2YTFi - Golang
https://t.iss.one/addlist/2Ls-snqEeytkMDgy - Машинное обучение
https://t.iss.one/addlist/8vDUwYRGujRmZjFi - Python
👍6🔥2🥰1
  🔥 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
👍26❤4👎3🔥3
  🔥 Материалы для изучения 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
❤12👍5🔥3😁1
  Сложность задачи: Средняя
Условие задачи:
Даны две строки 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
  👍8❤2🥰1
  🔍Что выведет код ?
▪Ответ
@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
👍12🔥5❤1
  👍30😱6🔥3❤2
  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
  👍7🔥3❤1👎1
  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
  👍14👎4🔥2🥰1
  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
  👍13❤2🔥2🥰1
  📌 Задача на систему непересекающихся множеств
Сложность: Средняя
Условие задачи: даётся 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
👍13❤1🔥1😁1
  Вызов функций 👣  из 🖥 
Недавно предо мной встала задача вызова функций 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
  👍12❤7😱6🔥1🤔1
  Barf - это полезный фреймворк для создания веб-интерфейсов API на основе JSON на Golang.
go get github.com/opensaucerer/barf▪ Github
@Golang_google
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍10❤3😁2🤔2🥰1
  Инструменты командной строки на GO, полезные для поиска багов, тестирования на проникновение и хакинга. Ориентирован на веб-цели.
golangci-lint run
▪ GIthub
@Golang_google
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍12🔥3❤2
  🔍Что выведет код ?
Ответ
@Golang_google
package main
import (
 "fmt"
)
func main() {
 x := [2]int{1, 2}
 r := [...]int{1, 2}
 fmt.Println(x == r)
}Ответ
@Golang_google
👍18🔥5👏1
  👍19❤2🥰1