Golang Portal
8.13K subscribers
429 photos
27 videos
7 files
458 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Golang-разработчика

Связь: @devmangx
Download Telegram
Каналы в Go: синхронизация и обмен данными

Каналы — это важная часть параллелизма в Go, предоставляющие механизм синхронизации и передачи данных между горутинами. Вот несколько ключевых приемов работы с каналами, которые помогут вам эффективно использовать их

1️⃣Каналы для синхронизации

Когда несколько горутин должны взаимодействовать или завершать выполнение последовательно, можно использовать каналы. Например, при помощи канала можно дождаться завершения одной горутины перед запуском другой:
done := make(chan bool)
go func() {
// Выполнение задачи
done <- true // Сигнал завершения
}()
<-done // Ожидание завершения

Канал done передает сигнал о завершении работы горутины, обеспечивая синхронизацию.

2️⃣ Каналы для передачи данных

Каналы позволяют обмениваться данными между горутинами. Вот пример, как одна горутина может передать число другой через канал:
numbers := make(chan int)
go func() {
numbers <- 42
}()
fmt.Println(<-numbers)

Это простая передача данных между двумя горутинами через канал numbers. Важное правило: одна горутина пишет в канал, другая — читает.

3️⃣ Буферизованные каналы

Буферизованные каналы позволяют записывать данные в канал без блокировки, если количество элементов меньше заданного буфера:
buffered := make(chan int, 2)
buffered <- 1
buffered <- 2

Буферизованный канал buffered на 2 элемента позволит записать два значения без ожидания их немедленного чтения другой горутиной.

4️⃣ Закрытие каналов

Закрытие канала важно, когда отправляющая горутина больше не собирается передавать данные:
close(numbers)

После закрытия канала, все попытки чтения из него продолжаются, пока не будут прочитаны все данные, после чего канал вернет нулевое значение для своего типа.

Каналы — мощный инструмент в Go для управления параллелизмом. Они обеспечивают простой и безопасный способ взаимодействия между горутинами, помогая создавать эффективные параллельные программы.

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍52
⚙️ Визуализация покрытия кода Go в виде древовидной карты

Интересный способ визуализировать большие проекты с помощью результатов go test -coverprofile.

$ go install github.com/nikolaydubina/go-cover-treemap@latest
$ go test -coverprofile cover.out ./...
$ go-cover-treemap -coverprofile cover.out > out.svg


👉 GitHub

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍122
Замыкания = универсальность

В языке Go замыкания используются повсеместно, давая возможность гибко решать разные задачи, используя один и тот же механизм.

Например, рассмотрим работу с картой в пакете sync — sync.Map:

var m sync.Map
m.Store("john", 21)
m.Store("maria", 25)
m.Store("steve", 29)


Для итерации по карте есть метод Range с сигнатурой:

Range(f func(key, value any) bool)


Но что, если нам нужно, например, посчитать сумму всех значений карты? Кажется, метод Range напрямую не позволяет этого сделать. Однако, благодаря замыканиям, мы можем обойти это ограничение:

sum := 0
m.Range(func(key, value any) bool {
sum += value.(int)
return true
})


Анонимная функция, передаваемая в Range, использует внешнюю переменную sum как накопитель. Таким образом, не изменяя сигнатуру метода, можно добиться нужного поведения.

Замыкания дают мощный инструмент для гибкости в коде.

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
💡 gRPC и Go на практике

Вы, вероятно, слышали о gRPC, если еще не использовали её. Она особенно популярна для межсервисной связи благодаря своей эффективности, языковой независимости и встроенной поддержке таких вещей, как MTLS.

Выше представлен простой пример начала работы с gRPC от Matt Boyle.

👉 @juniorGolang | #tip
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Полезные приемы форматирования

Вот несколько приемов форматирования, которые могут быть вам полезны:

1️⃣ Закавыченная строка

Используйте %q, чтобы вывести строковое значение в кавычках.

s := "Hello, World!"
fmt.Printf("%q\n", s)
// "Hello, World!"


2️⃣ Названия полей структуры

Используйте %+v, чтобы вывести названия полей структуры, а не только значения.

alice := person{"Alice", 25}
fmt.Printf("%+v\n", alice)
// {name:Alice age:25}


3️⃣ Тип значения

Используйте %T, чтобы вывести тип значения.

var val any
val = 42
fmt.Printf("%T: %v\n", val, val)
// int: 42

val = "Hello, World!"
fmt.Printf("%T: %v\n", val, val)
// string: Hello, World!

val = person{"Alice", 25}
fmt.Printf("%T: %v\n", val, val)
// main.person: {Alice 25}


4️⃣ Индекс аргумента

Можно явно указать, какой по порядку аргумент выводить. Полезно, если одно и то же значение выводится несколько раз (как в примере с val выше).

num := 42
fmt.Printf("%[1]T: %[1]v\n", num)
// int: 42


Нумерация с 1.

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍158
Анонимная сеть в 100 строк кода на Go

Прошло уже более года с тех пор как я написал статью - Анонимная сеть в 200 строк кода на Go. Пересмотрев её однажды осенним вечером я понял насколько всё в ней было ужасно - начиная с самого поведения логики кода и заканчивая его избыточностью. Сев за ноутбук и потратив от силы 20 минут у меня получилось написать сеть всего в 100 строк кода, используя лишь и только стандартную библиотеку языка.


👉 Читать статью

👉 @juniorGolang | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥9
Нашли для вас два классных ресурса, которые помогут разобраться в GIT

🔜 Learn Git Branching — это интерактивный учебник по Git, направленный на закрепление теории прохождением наглядной практики.

🔜 Oh My Git! — игра для обучения Git. Там визуализируются внутренние структуры репозиториев. Игра опенсорс, так что можно покопаться в исходниках

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
⚙️ ObjectBox Go — встроенная база данных, которую можно использовать как альтернативу SQLite, gorm и т. д

ObjectBox проста в использовании благодаря интуитивно понятному встроенному API:


id, err := box.Put(&Person{ FirstName: "Joe", LastName: "Green" })


👉 Документация
👉 GitHub

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
В чем сила пакета singleflight?

🔹singleflight предоставляет механизм подавления дублирующихся вызовов функций. Например, наше приложение запрашивает данные из API или базы данных.

🔹Если несколько запросов инициируют один и тот же вызов, это может привести к множественным идентичным вызовам к БД или API. Это создает нагрузку на систему, ведет к потерям CPU, памяти и пропускной способности сети.

🔹Matthew Boyle, автор Domain-Driven Design with Golang, приводит пример использования singleflight для устранения дублирующихся вызовов. В примере, несмотря на то, что 5 горутин одновременно запрашивают данные для одного и того же ключа, функция fetchData будет вызвана только один раз благодаря функции group.Do из пакета singleflight.

💡 singleflight также может используется в serverless кейсах. Google App Engine, например, применяет его как часть функции инициализации, поскольку там нет main.go.

👉 @juniorGolang | #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
This media is not supported in your browser
VIEW IN TELEGRAM
Набор инструментов на Go для создания React-like GUI

Spot — это простой, кроссплатформенный, реактивный GUI-инструментарий для Go, использующий нативные виджеты там, где это возможно.
Большой акцент при разработке Spot был сделан на простоту использования и предоставление согласованного API на разных платформах

Ссылка: тык

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91
Подборка из 25 полезных ресурсов для разработчиков на Go

В нее входят инструменты, библиотеки и утилиты для управления базами данных, сериализации, обработки ошибок, генерации уникальных идентификаторов и других задач

👉 https://dev.to/0x3d_site/25-golang-resources-every-developer-will-find-helpful-and-interesting-1ooh

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Недавно наткнулся на интересную штуку — Go Blueprint.

Это CLI-инструмент, который позволяет быстро развернуть проект на Go с уже настроенной структурой.

Можно выбрать один из популярных фреймворков, таких как Chi, Gin, Fiber и другие. Кроме того, поддерживаются различные базы данных: MySQL, Postgres, SQLite, MongoDB и даже Redis

Плюс, есть прикольные фичи, такие как поддержка HTMX, настройка CI/CD через GitHub Actions, интеграция с Docker и даже генерация фронтенда на React с TypeScript.

Если хотите заценить, как это работает, вот видеообзор: https://youtu.be/-8XKrQUexrQ?si=KxwnMPDfT-DXM6sx

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63🌚1
Build an OTP-Based Authentication Server with Go

В серии из двух статей автор Vishal Axl подробно рассказывает, как создать сервер аутентификации на основе одноразовых паролей (OTP) с использованием языка Go.

👉 Первая часть посвящена настройке структуры проекта, Docker-среды и базовой HTTP-маршрутизации.

👉 Вторая часть фокусируется на реализации генерации OTP, управлении сроком их действия и организации временного хранилища данных.

👉 @juniorGolang | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
⚙️ wp2hugo — инструмент для миграции блогов с WordPress на Hugo, написанный на Go

Популярный генератор статических сайтов на базе Go, и этот инструмент позволяет легко конвертировать в него блоги на базе WordPress, включая множество особых случаев, в которых WordPress REST API не помогает.

🔛 GitHub

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2
Создание Go-приложений на базе LLM

Retrieval Augmented Generation (RAG) позволяет предоставлять LLM знания из кастомных ресурсов, от локальных текстовых файлов до репозиториев кода. Затем LLM может использовать эти новые знания для ответов на вопросы.

🔛 Читать

👉 @juniorGolang | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Откопал тут годный инструмент — библиотека GoMailer для Go🍌

Это мощная штука, построенная на стандартном net/smtp, но с кучей плюшек. Например, отправка писем с HTML и вложениями, удобная работа с заголовками, гибкая настройка TLS и аутентификации.

Подключить можно через go get, а настроить — проще простого

🔛 GoMailer

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥142👍1
How HTTP/2 Works and How to Enable It in Go

HTTP/2 является значительным улучшением по сравнению с HTTP/1.1, решая проблему блокировки "head-of-line" на уровне приложения путем мультиплексирования нескольких потоков через одно TCP-соединение.

В статье подробно рассматривается, как HTTP/2 достигает этого, а также описываются шаги по его включению в Go-приложениях.

Стандартная библиотека Go поддерживает HTTP/2 по умолчанию при использовании HTTPS, и с некоторой конфигурацией его можно настроить для работы поверх обычного HTTP.

Для получения более подробной информации рекомендуется ознакомиться с полной статьей

👉 @juniorGolang | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6