37.1K subscribers
1.46K photos
34 videos
5 files
1.62K links
加入频道
🔥 Дайджест полезных материалов из мира Golang за неделю

Инструменты недели:

xgo — библиотека, которая позволяет добавить функцию Trap и предоставляет такие инструменты, как Mock и Trace. xgo помогает разработчикам писать юнит-тесты и отлаживать их проще и быстрее.
portr - туннельное решение, позволяющее подключать локальные HTTP и TCP-соединения к общедоступному Интернету.
reverst - обратный туннель (с балансировщиком нагрузки) и клиентская библиотека Go-сервера, построенная на основе QUICK и HTTP/3
#golang
gorabbit - оболочка на GO, обеспечивающая высокоуровневую и надежную работу RabbitMQ с помощью клиента или менеджера.
househunt — полноценное веб-приложение на Go, которое научит вас создавать правильную структуру проекта.

Почитать:
Аутентификация go с использованием токенов PASETO
Годный самоучитель по CI/CD и Kubernetes для Go-разработчиков
Нативные подписки с роутером Cosmo
Odinbit, игра моей мечты и процесс её создания. С нуля до первой публичной версии
GoLand и его фишки
Конкурентность и параллелизм в Go
Go повышение производительности в версиях с 1.0 по 1.22
Введение в Router Cosmo — потрясающе быстрый шлюз с открытым исходным кодом Federation V1/V2
Пространство имен для GraphQL: Бесконфликтное объединение любого количества API
Building "Journal Buddy": A Custom GPT for Personal Reflection
Progress in My P2P Library: A Work in Progress
What Happens After Agile Dies?
Why should you try GoCfg or yet another Go config manager
Exploiting HTTP/2 CONTINUATION frames for DoS attacks
Gorabbit: RabbitMQ supercharged for Go Applications
Build a CLI tool : Generating hex dumps with Golang

Посмотреть:
🌐Создание Redis с нуля на Golang ( 02:49:24)
🌐 Mastering And Taming NIL Pointers in Golang For Beginners ( 13:24)
🌐 How To Build A Complete Distributed File Storage In Golang ( 09:57:01)
🌐 If U Use GitHub CO-PILOT I Wont Hire You!? ( 11:21)
🌐 Programming Career Paths, Roadmaps, LeetCode, And Salaries ( 02:28:42)
🌐 Building Redis In Golang And NeoVim Setup With ThePrimeagen ( 03:28:48)
🌐 Building Redis From Scratch In Golang - Learn Go Like A PRO ( 02:49:29)
🌐 Developers Do NOT Understand the POWER Of HTMX ( 10:31)

Хорошего дня!

@Golang_google
🔥Подборка лучших обучающих каналов для программистов.

➡️ Делитесь с коллегами и сохраняйте себе, чтобы не потерять

Машинное обучение

Machine Learning - запускаем лучшие ИИ модели, пишем код, погружаемся в нейросети
Ml Собеседование - подготовка к собесу по мл, алгоритмам, коду
Ml ru - актуальные статьи, новости, код и обучающие материалы
Ml Jobs - вакансии ML
ML Книги - актуальные бесплатные книги МО
ML чат

🏆 Golang
Golang
Golang собеседование - разбор задач и вопросов с собесов
Golang вакансии -работа для Go разработчика
Golang книги библиотека книг
Golang задачи и тесты
Golang чат
Golang news - новости из мира go
Golang дайджест

💥 Linux /Этичный хакинг
Linux Academy - гайды, секреты и лучшие материалы по Linux
Kali linux - погрузись в мир этичного хакинга и кибербезопасности
linux_kal - kali чат
Информационная безопасность

🚀 Data Science

Анализ данных - полезные фишки, код, гайды и советы, маст-хэв датасаентиста
Data Jobs - ds вакансии
Аналитик данных
Data Science книги - актуальные бесплатные книги
Big data

🛢Базы данных
Sql базы данных - научим работе с базами данных профессионально
Библиотека баз данных
SQL чат
Вакансии Sql аналитик данных

#️⃣C#

С# академия - лучший канал по c#
С# заметки — код, лучшие практики, заметки программиста c#
С# задачи и тесты
С# библиотека - актуальные бесплатные книги
C# вакансии - работа

🐍 Python

Python/django - самый крупный обучающий канал по Python
Python Собеседование - подготовка к собеседовению python и разбор алгоритмов
Pro python - статьи, новости, код и обучающие материалы
Python Jobs - вакансии Python
Python чат
Python книги

Java

Java академия - java от Senior разработчика
Java вакансии
Java чат
Java вопросы с собеседований
Java книги

💻 C++

C++ академия
С++ книги
C++ задачи - подготовка к собеседовению мл, алгоритмам
C++ вакансии

⚡️ Frontend
Javascript академия - крупнейший js канал
React - лучшие гайды и советы по работе с react
Frontend - тутрориалы, уроки, гайды, код
PHP
Книги frontend
Задачи frontend

🦀 Rust
Rust программирование
Rust чат
Rust книги для программистов

📲 Мобильная разработка
Android разработка
Мобильный разработчик гайды и уроки

🇬🇧 Английский для программистов

🧠 Искусственный интеллект
ИИ и технологии
Neural - нейросети для работы и жизни
Книги ИИ
Artificial Intelligence

🔥 DevOPs
Devops для программистов
Книги Devops

🌟 Docker/Kubernets
Docker
Kubernets

📓 Книги
Библиотеки Книг для программситов

💼 Папка с вакансиями:
Папка Go разработчика:
Папка Python разработчика:
Папка Data Science
Папка Java разработчика
Папка C#
Папка Frontend
👣 Тэги структур в Go

▶️В Go при сериализации JSON в структуру используются мета-теги, которые записываются рядом с полями структуры:
type Response2 struct {
Page int `json:"page"`
Fruits []string `json:"fruits"`
}

В данном случае это ``json:"page"`` и ``json:"fruits"``.

Но иногда, вместо JSON используются другие стандарты, BSON и др. Так вот, что делать в случае других стандартов?


▶️Сразу можно сказать, что в теге может быть несколько полей для разных стандартов, например, тут одновременно можно обращаться со структурой как с JSON, и как с YAML:
type Response2 struct {
Page int `json:"page" yaml:"page" validation:"min:1,max:10"`
Fruits []string `json:"fruits" yaml:"fruits,omitempty" validation:"nonempty"`
}

r := &Response2{}
json.Read("file.json", r)
validator.Validate(r)
yaml.Write("file.yaml", r)


Также тэги можно разбирать самостоятельно и использовать в своих библиотеках, подробнее об этом тут.
Дополнительно о тэгах структур почитать можно здесь.

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Маршалинг и анмаршалинг нестандартных форматов дат в Go

Думаю, многие согласятся, что работа с датами практически в любом языке — это невероятная головная боль. Дата и время не десятичны и конечно же бесчисленное множество форматов даты и времени.
Вдобавок к этому ISO 8601 не всегда соблюдается в сторонних API, что создает неприятности.

О том, как можно всё это героически решить, и пойдёт речь в статье.
Если коротко, то решение проблемы заключается в использовании кастомных типов и функций Unmarshaler для парсинга нестандартных дат.
Этот подход также может быть использован для успешного парсинга любого нестандартного контента, кстати.

📎 Статья

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Прервать функцию с горутинами, если выполняется слишком долго

▶️Задача: в функции нужно запустить несколько горутин с вычислениями и дождаться их окончания.
При этом, если функция будет работать больше указанного количества секунд, нужно прервать ее выполнение.
Таким образом нужно прервать выполнение этой функции fun() ниже, что можно сделать?

package main

import (
"fmt"
"sync"
)

func FibonacciRecursion(n int) int {
if n <= 1 {
return n
}
return FibonacciRecursion(n-1) + FibonacciRecursion(n-2)
}

func f(i int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println(FibonacciRecursion(45 + i))
}

func fun() {
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
go f(i, &wg)
wg.Add(1)
}
wg.Wait()
println("Function ended")
}

func main() {
fun()
}



▶️Что ж, для этих целей как раз и используется пакет context.
С помощью context код выше можно переписать так:

package main

import (
"context"
"fmt"
"sync"
"time"
)

func main() {
timeLimit := time.Second * 10
ctx, cancel := context.WithTimeout(context.Background(), timeLimit)
defer cancel()
fun(ctx)
}

func isDone(ctx context.Context) bool {
select {
case <-ctx.Done():
return true
default:
return false
}
}

func FibonacciRecursion(ctx context.Context, n int) int {
if n <= 1 || isDone(ctx) {
return n
}
return FibonacciRecursion(ctx, n-1) + FibonacciRecursion(ctx, n-2)
}

func f(ctx context.Context, i int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println(FibonacciRecursion(ctx, 45+i))
}

func fun(ctx context.Context) {
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go f(ctx, i, &wg)
}
wg.Wait()
println("Function ended")
}

Такие вот дела

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Mongo-driver Golang - реконнект к серверу Mongo

▶️Вопрос: как реализовано переподключение приложения на Golang к MongoDB в случае потери соединения в библиотеке go.mongodb.org/mongo-driver/mongo?

На локальном компьютере при отключении Mongo приложение в течение 30 секунд висит (видимо пытается подключиться).

Это время — оно задается в настройках клиента библиотеки или в самой Mongo или от чего еще зависит? Mongo поднята в контейнере, код подключения такой:
ctx, _ := context.WithTimeout(context.Background(), timeoutSecond*time.Second)

client, err := mongo.Connect(ctx, options.Client().ApplyURI(connString))


Сам запрос вот:
err := mr.client.Database(mr.dbName).Collection(mr.collName).FindOne(ctx, filter).Decode(&p)



▶️Ответ: можно контролировать работу этого приложения с помощью context.WithTimeout или context.WithCancel(ctx). Помимо этого, у вас имеется возможность настроить клиент к базе.
У клиента есть ряд параметров с таймаутами, одни для выполнения одной операции, другие отвечают за время подключения к серверу (можно сказать время отклика сервера).

Когда мы кладём БД и исполняем запрос, то висит канал (go channel), который ожидает выполнения функции, либо завершения контекста, истечения timeout этого запроса.
select {
case <-ctx.Done():
return nil, ctx.Err()
case <-selectionState.timeoutChan:
return nil, wrapServerSelectionError(ErrServerSelectionTimeout, t)
case current = <-subscriptionCh:
}

срабатывает <-selectionState.timeoutChan, по умолчанию его значение 30 секунд

Документация говорит, что клиент нужно настроить следующим образом, чтобы продлить время ожидания отклика:
client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017"),
options.Client().SetConnectTimeout(time.Second * myTimeout),
options.Client().SetServerSelectionTimeout(time.Second * myServerTimeout))


@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Шпаргалка по Go

Мощная шпаргалка по Go, которая покрывает практически все темы
Если пролистать хотя бы по диагонали, есть отличный от нуля шанс пройти собеседование и получить оффер)

Что внутри?
├╼ Компилятор
├╼ Пакеты
├╼ Функции
├╼ Управление памятью
├╼ Операторы
├╼ Управляющие структуры
├╼ Объектноориентированность
├╼ Интерфейсы
├╼ Обработка ошибок
├╼ Горутины (Goroutine)
├╼ Проверка управления памятью
├╼ Reflect
├╼ Добавление кода C
├╼ GUI
╰╼ Распределенные системы

📎 Cheatsheet

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Как написать и запустить миграцию базы данных в Golang

При работе с базой данных миграция схемы является одной из важных задач, которую нам часто приходится выполнять на протяжении всего жизненного цикла приложения, чтобы адаптироваться к новым бизнес-требованиям.
И в этой статье речь пойдёт о том, как написать и запустить миграцию схемы базы данных в Golang, используя библиотеку golang-migrate, уверен, будет полезно

📎 Туториал
📎 YouTube

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Аутентификация и OAuth с помощью Go

Держите полезные библиотеки для реализации схем аутентификации. Вы готовы? Их немало)

🟡 authboss — Модульная система аутентификации для Интернета. Он пытается удалить как можно больше шаблонов и «сложных вещей», чтобы каждый раз, когда вы запускаете новый веб-проект в Go, вы могли подключить его, настроить и начать создавать свое приложение без необходимости каждый раз создавать систему аутентификации.

🟡 branca — реализация спецификации токена branca для Golang 1.15+.

🟡 casbin — библиотека авторизации, поддерживающая такие модели управления доступом, как ACL, RBAC и ABAC.

🟡 cookietxt — предоставляет анализатор файлов формата cookie.txt.

🟡 go-guardian — Go-Guardian — это библиотека golang, которая предоставляет простой, понятный и идиоматический способ создания мощного современного API и веб-аутентификации, поддерживающей LDAP, базовую аутентификацию, аутентификацию на основе токена и сертификата.

🟡 go-jose — довольно полная реализация спецификаций JSON Web Token, JSON Web Signatures и JSON Web Encryption рабочей группы JOSE.

🟡 gologin — цепочки обработчиков для входа в систему с помощью поставщиков аутентификации OAuth1 и OAuth2.

🟡 gorbac — предоставляет облегченную реализацию управления доступом на основе ролей (RBAC) в Golang.

🟡 gosession — это быстрый сеанс для net/http в GoLang. Этот пакет, возможно, является лучшей реализацией механизма сеансов или, по крайней мере, пытается им стать.

🟡 goth — предоставляет простой, понятный и идиоматический способ использования OAuth и OAuth2. Обрабатывает несколько провайдеров «из коробки».

🟡 jeff — Простое, гибкое, безопасное и идиоматичное управление веб-сессиями с помощью подключаемых серверных частей.

🟡 jwt — безопасные, простые и быстрые веб-токены JSON для Go.

🟡 jwt-auth — промежуточное программное обеспечение JWT для http-серверов Golang со множеством параметров конфигурации.

🟡 jwt-go — полнофункциональная реализация веб-токенов JSON (JWT). Эта библиотека поддерживает синтаксический анализ и проверку, а также генерацию и подписание JWT.

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Получение параметров при использовании ssl

▶️Итак, реальный кейс, связанный с использованием ssl/tls сертификатов. В коде есть фрагменты передачи данных из форм такого типа
http://localhost:8080/?param1=value


Сейчас, без использования шифрования транспорта, можно получить значение param1 так
r.FormValue("param1")

Вопрос: если начать шифровать транспорт, сами данные останутся незашифрованны ведь? Или придётся изменить способ получения параметров из запроса и сперва эти параметры расшифровать?


▶️Вообще, здесь не важно, происходит шифрование транспорта или нет, в хендлер придут данные в расшифровоном виде. Вот простой пример:
package main

import (
"fmt"
"log"
"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "text/plain")
w.Write([]byte(fmt.Sprintf("param1=%s", r.FormValue("param1"))))
}

func main() {
http.HandleFunc("/", handler)
http.NewServeMux()
err := http.ListenAndServeTLS(":8080", "server.crt", "server.key", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}


А вот команда генерации сертификатов:
openssl req -x509 -nodes -newkey rsa:2048 -keyout server.key -out server.crt -days 3650

Такие дела

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Go: распространенные антипаттерны

Самый простой способ писать хороший код заключается в том, чтобы не употреблять в своих программах «антипаттерны». Собственно, об этом и идёт речь в этой полезной статье

А вот некоторые из обсуждаемых антипаттернов:
🟡Возврат значения неэкспортируемого типа из экспортируемой функции
// Не рекомендовано
type unexportedType string
func ExportedFunc() unexportedType {
return unexportedType("some string")
}

// Рекомендовано
type ExportedType string
func ExportedFunc() ExportedType {
return ExportedType("some string")
}


🟡Неоправданное использование пустых идентификаторов
// Не рекомендовано
for _ = range sequence
{
run()
}

x, _ := someMap[key]

_ = <-ch

// Рекомендовано
for range something
{
run()
}

x := someMap[key]

<-ch


🟡Ненужное выражение return в функциях
// Бесполезное выражение return, не рекомендовано
func alwaysPrintFoofoo() {
fmt.Println("foofoo")
return
}

// Рекомендовано
func alwaysPrintFoo() {
fmt.Println("foofoo")
}


🟡Ненужные команды break в выражениях switch
// Не рекомендовано
switch s {
case 1:
fmt.Println("case one")
break
case 2:
fmt.Println("case two")
}

// Рекомендовано
switch s {
case 1:
fmt.Println("case one")
case 2:
fmt.Println("case two")
}


📎 Статья

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Как загрузить пакет из приватного репозитория?

Итак, ситуация. Есть приватный репозиторий. Можно склонировать себе данный репозититорий по ssh, но через go get / go install происходит ошибка:
go: unrecognized import path "private.gitlab.ru/repositoryName": https fetch: Get "https://private.gitlab.ru/repositoryName?go-get=1": dial tcp 255.255.255.255:443(левый IP адрес): i/o timeout

Попытки установить хост данного репозитория себе в переменные GONOPROXY / GOPRIVATE / GONOSUMDB не помогли, ошибка остаётся той же.


Возможно, у кого-то тоже была такая проблема, надеюсь, этот совет ещё кому-то пригодится. Итак, если есть доступ по SSH, можно использовать такой вариант:
git config --global url."[email protected]".insteadOf "https://private.gitlab.ru"


🟡Или используя access-токен
git config --global url."https://${user}:${personal_access_token}@private.gitlab.ru".insteadOf"https://private.gitlab.ru"

После этого go get / go install будут работать с приватными репозиториями.

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
👣 Разработка простого DNS сервера на Go, согласно RFC

О чём речь в статье?
🟡Небольшое введение в DNS в целом, как эти серверы позволяют связать IP и URL; о том, что DNS протокол является прикладным протоколом, работающим поверх UDP

🟡В протоколе реализуется один формат сообщения, его размер — 512 байт; описывается структура сообщения и его заголовок

🟡Описывается процесс распарсивания заголовка запроса и кодирования его для ответа

🟡В общем, по итогу создаётся минимальный рабочий DNS сервер на Go, что можно без проблем повторить

📎 Статья

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
1

сделаем это пост полезным - выкладывайте в комментариях свои проекты, код, наработки, лучшие попадут в подборку.
👣 Go-mongox

Пакет Go Mongo, поддерживающий операции по работе с документами и эффективным компоновщиком данных BSON с использованием различных типов данных.

BSON - бинарная форма представления простых структур данных и ассоциативных массивов (которые в контексте обмена называют объектами или документами)

go get github.com/chenmingyong0423/go-mongox

#golang #MongoDB

Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Лимит на количество открытых дескрипторов

▶️Вопрос, связанный с написанием демона на Go при помощи go-daemon:
какой лимит по умолчанию на количество открытых дескрипторов файла в Go? Как его менять? И есть ли общепринятые рекомендации по их количеству?


▶️Начать стоит с проверки ulimit -a и ulimit -aH в shell'е перед запуском вашего демона. Это быстро покажет текущие "мягкие" и (второй вызов) "жесткие" ограничения. При помощи ulimit можно открутить мягкие ограничения до пределов жестких. Следует понимать, что ulimit меняет только текущие лимиты, для шелла и всех программ, запущенных в этом шелле, поэтому после завершения сессии или даже в другом окне терминала значения останутся прежними.

🟡Следующее место задания ограничений, на этот раз постоянных — это /etc/security/limits.conf и каталог /etc/security/limits.d/, ограничение называется nofile. Редактировать (а, иногда, и смотреть) эти файлы может только суперпользователь ("root"). Там задаются ограничения на отдельных пользователей или группы, применяемые на всю сессию данного пользователя, или всех пользователей определенной группы.

🟡И наконец, есть "системное ограничение", задаваемое через sysctl - это fs.nr_open:
/sbin/sysctl -n fs.nr_open
ему же соответствует файл /proc/sys/fs/nr_open

🟡"Программно" манипулирование лимитами текущего процесса в пределах жестких ограничений, заданных на сессию, осуществляется через вызовы getrlimit/setrlimit, которые можно звать из Go, используя FFI (примеры можно посмотреть здесь)

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM