37.1K subscribers
1.46K photos
34 videos
5 files
1.62K links
加入频道
👣 GoLand и его фишки

Для тех, кто ещё не пробовал использовать GoLand для работы с Go — попробуйте, вам понравится)

Вот некоторые фишки:

Умное автодополнение. Автодополнение в GoLand помогает писать код быстрее. Сочетание клавиш Ctrl+Shift+Space вызывает список вариантов автодополнения, наиболее подходящих для данного контекста.

Инспекции и быстрые исправления. Обнаружив проблему, IDE тут же предложит ее исправить. Чтобы применить автоматическое исправление, просто нажмите Alt+Enter.

Генерация кода. В некоторых случаях GoLand может cгенерировать для вас тривиальный код. Например, если вы нажмете Ctrl+O, IDE поможет вам реализовать любой интерфейс, сгенерировав его методы.

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

Действие Type Parameter. Действие Type Parameter (Alt+) всегда под рукой, если необходимо узнать тип выражения, на котором находится курсор.

Подсветка точек выхода. Каждая функция может иметь больше одного оператора return или panic. Чтобы быстро найти их все, нажмите Ctrl+Shift+F7, установив курсор на ключевом слове func, return или panic. Это поможет быстрее понять, как работает функция.

Вот такие классные возможности, так что пользуйтесь GoLand)
📎 Читать подробнее

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Некоторые возможности ssh в Go

Создать ssh-сервер на Go можно при помощи модуля golang.org/x/crypto/ssh.
А при помощи пакета github.com/gliderlabs/ssh можно разработать ssh-сервер легко и быстро. Ssh подразумевает не только доступ к оболочке (shell), но и прочие возможности: файловый сервер (sftp), проброс портов.

Репозиторий проекта содержит минимальный пример, выводящий строку «Hello world» любому подключенному ssh-клиенту:

package main

import (
"github.com/gliderlabs/ssh"
"io"
"log"
)

func main() {
ssh.Handle(func(s ssh.Session) {
io.WriteString(s, "Hello world\n")
})

log.Fatal(ssh.ListenAndServe(":2222", nil))
}


Терминал. Полноценный терминальный эмулятор можно реализовать при помощи модуля golang.org/x/term.

Упрощенно обработчик будет выглядеть вот так:

import (
...
terminal "golang.org/x/term"
)

func sessionHandler(s gssh.Session) {
defer s.Close()
if s.RawCommand() != "" {
io.WriteString(s, "raw commands are not supported")
return
}

// создаем терминал
term := terminal.NewTerminal(s,
fmt.Sprintf("/%s/ > ", s.User()))

// добавляем обработку pty-request
pty, winCh, isPty := s.Pty()
if isPty {
_ = pty
go func() {
// реагируем на изменение размеров терминала
for chInfo := range winCh {
_ = term.SetSize(chInfo.Width, chInfo.Height)
}
}()
}

for {
// считываем ввод пользователя
line, err := term.ReadLine()
if err == io.EOF {
_, _ = io.WriteString(s, "EOF.\n")
break
}

// обработаем результат
result = processInput(line)

// выведем в терминал
io.WriteString(term, result)
}
}



GitHub
Подробнее

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

Оболочка на GO, обеспечивающая высокоуровневую и надежную работу RabbitMQ с помощью клиента или менеджера.

RabbitMQ — программный брокер сообщений на основе стандарта AMQP — тиражируемое связующее программное обеспечение, ориентированное на обработку сообщений.

Github

@Golang_google
👣 reverst: HTTP reverse tunnels over QUIC

Обратный туннель (с балансировщиком нагрузки) и клиентская библиотека Go-сервера, построенная на основе QUICK и HTTP/3
#golang

Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Отличная подборка материалов по Go: книги, шпаргалки, туториалы

Здесь вы наверняка найдёте что-то полезное для себя, покрываются практически все темы Go

Основы языка
— Синтаксис и структура программ • Переменные, типы данных, операторы • Управляющие структуры (циклы, условные операторы) • Функции и пакеты.

Структуры данных
— Массивы и срезы • Строки и форматирование • Карты • Структуры.

Обработка ошибок
— Обработка ошибок в Go • Пакет errors и создание пользовательских ошибок.

Конкурентность и параллелизм
— Горутины и каналы • sync пакет для синхронизации доступа к данным • context пакет для управления жизненным циклом горутин.

Сетевое программирование
— Создание HTTP серверов и клиентов • Работа с TCP и UDP • Использование net и net/http пакетов.

Работа с файловой системой
— Чтение и запись файлов • Операции с директориями • Использование пакета os и io.

Базы данных
— Работа с SQL и NoSQL базами данных • Использование пакетов database/sql и go-sql-driver • Интеграция с ORM, например, GORM.

Тестирование
— Написание и запуск тестов • Использование пакета testing • Тестирование с помощью моков и заглушек.

📎 Ссылка

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

Go Migrate — это инструмент для управления миграциями базы данных, написанный на языке Go. Он может использоваться как интерфейс командной строки (CLI), так и импортироваться в качестве библиотеки для проектов Go.
Go Migrate может считывать файлы миграции из различных источников и применять их к базе данных в правильном порядке. Он поддерживает различные драйверы баз данных и источники миграции.

Go Migrate поддерживает множество драйверов базы данных, включая:
PostgreSQL • Cassandra • SQLite • MariaDB • MongoDB • ClickHouse

Чтобы использовать Go Migrate в вашем проекте Go, вам нужно импортировать необходимые пакеты и библиотеки. Вот пример:
import (
"github.com/golang-migrate/migrate/v4"
_ "github.com/golang-migrate/migrate/v4/database/postgres"
_ "github.com/golang-migrate/migrate/v4/source/github"
)

func main() {
m, err := migrate.New(
"github://mattes:personal-access-token@mattes/migrate_test",
"postgres://localhost:5432/database?sslmode=enable")
m.Steps(2)
}

Этот код инициализирует Go Migrate с указанным источником и базой данных, затем применяет 2 миграции, используя метод Steps.

📎 Подробнее
📎 GitHub 13.8k ⭐️

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Дайджест полезных материалов из мира 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