Здесь вы наверняка найдёте что-то полезное для себя, покрываются практически все темы 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 может считывать файлы миграции из различных источников и применять их к базе данных в правильном порядке. Он поддерживает различные драйверы баз данных и источники миграции.
PostgreSQL • Cassandra • SQLite • MariaDB • MongoDB • ClickHouse
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
.@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
https://benhoyt.com/writings/go-version-performance-2024/
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Benhoyt
Go performance from version 1.0 to 1.22
Shows how much the performance of Go has improved from version 1.0 through to 1.22 (including PGO) -- in its compiler, runtime, and libraries.
🔥 Дайджест полезных материалов из мира 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
Инструменты недели:
• 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
➡️ Делитесь с коллегами и сохраняйте себе, чтобы не потерять
⚡Машинное обучение
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
type Response2 struct {
Page int `json:"page"`
Fruits []string `json:"fruits"`
}
В данном случае это ``json:"page"`` и ``json:"fruits"``.
Но иногда, вместо JSON используются другие стандарты, BSON и др. Так вот, что делать в случае других стандартов?
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
Вдобавок к этому 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
код выше можно переписать так:
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
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, которая покрывает практически все темы
Если пролистать хотя бы по диагонали, есть отличный от нуля шанс пройти собеседование и получить оффер)
Что внутри?
├╼
Компилятор├╼
Пакеты├╼
Функции├╼
Управление памятью├╼
Операторы├╼
Управляющие структуры├╼
Объектноориентированность├╼
Интерфейсы├╼
Обработка ошибок├╼
Горутины (Goroutine)├╼
Проверка управления памятью├╼
Reflect ├╼
Добавление кода C├╼
GUI╰╼
Распределенные системы@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
При работе с базой данных миграция схемы является одной из важных задач, которую нам часто приходится выполнять на протяжении всего жизненного цикла приложения, чтобы адаптироваться к новым бизнес-требованиям.
И в этой статье речь пойдёт о том, как написать и запустить миграцию схемы базы данных в Golang, используя библиотеку
golang-migrate
, уверен, будет полезно@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Держите полезные библиотеки для реализации схем аутентификации. Вы готовы? Их немало)
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
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
Самый простой способ писать хороший код заключается в том, чтобы не употреблять в своих программах «антипаттерны». Собственно, об этом и идёт речь в этой полезной статье
А вот некоторые из обсуждаемых антипаттернов:
// Не рекомендовано
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
не помогли, ошибка остаётся той же.git config --global url."[email protected]".insteadOf "https://private.gitlab.ru"
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
О чём речь в статье?
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
1
сделаем это пост полезным - выкладывайте в комментариях свои проекты, код, наработки, лучшие попадут в подборку.
сделаем это пост полезным - выкладывайте в комментариях свои проекты, код, наработки, лучшие попадут в подборку.