en
Feedback
Golang Дайджест

Golang Дайджест

Open in Telegram

Самое интересное из мира Go: новости, статьи, проекты, сервисы, изменения в языке и др. Посты публикуются не часто - только самое важное, с чем я лично ознакомился. Поэтому можно не мьютить канал =) Обратная связь: @justskiv

Show more
5 678
Subscribers
No data24 hours
No data7 days
No data30 days
Posts Archive
Шахматный движок на Go https://github.com/rbw317/chess_go На мой взгляд, в первую очередь, проект интересен как объект для изучения - движок не самый умный, но и код относительно простой. Есть простенький консольный интерфейс и полноценный веб-фронтэнд. Демку с веб-версией можно потыкать тут. Также проект может быть интересен тем, кто хочет потренироваться в написании интерфейсов на разных технологиях. К примеру, можете написать оболочку на том же Ebitengine. #go_project

Repost from Selectel Careers
Как дебажить concurrency-код в Go? Сергей Петров, разработчик IAM, собрал инструменты, которые вам для этого пригодятся. Неоч
+9
Как дебажить concurrency-код в Go? Сергей Петров, разработчик IAM, собрал инструменты, которые вам для этого пригодятся. Неочевидности в Go, завязка библиотек на процессор, скедулинг горутин — обо всем этом смотрите в докладе!

Advanced gRPC Error Usage https://jbrandhorst.com/post/grpc-errors/ Коротенькая статья о том, как с помощью пакета status добавлять произвольные метаданные к ошибкам. Это бывает очень удобно при разборе и обработке ошибок между сервисами. Пример:
st := status.New(codes.InvalidArgument, "invalid username")
desc := "The username must only contain alphanumeric characters"
v := &errdetails.BadRequest_FieldViolation{
    Field: "username",
    Description: desc,
}
br := &errdetails.BadRequest{}
br.FieldViolations = append(br.FieldViolations, v)
st, err := st.WithDetails(br)
if err != nil {
    // If this errored, it will always error
    // here, so better panic so we can figure
    // out why than have this silently passing.
    panic(fmt.Sprintf("Unexpected error attaching metadata: %v", err))
}
return st.Err()

———— За ссылку спасибо @ekostogorov #grpc #article

Используете ли вы глобальный логгер? Речь про рабочие проекты, серьезные пет-проекты и т.п. И поделитесь в комментариях своим опытом - нравится ли вам такой подход? Почему?
Anonymous voting

Прокачали логгер, теперь взялись за HTTP-роутер https://eli.thegreenplace.net/2023/better-http-server-routing-in-go-122/ - Proposal - Документация Пример кода:
package main

import (
  "fmt"
  "net/http"
)

func main() {
  mux := http.NewServeMux()
  mux.HandleFunc("GET /path/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "got path\n")
  })

  mux.HandleFunc("/task/{id}/", func(w http.ResponseWriter, r *http.Request) {
    id := r.PathValue("id")
    fmt.Fprintf(w, "handling task with id=%v\n", id)
  })

  http.ListenAndServe("localhost:8090", mux)
}

1. В первом хэнделере мы видим явное указание HTTP-метода (GET) 2. Во втором - компонент {id} и r.PathValue("id") для получения значения За ссылку спасибо @batazor #go_updates #http

Самый быстрый поиск пути на Go без аллокаций и СМС https://habr.com/ru/articles/766882/ Искандер рассказывает про алгоритмы поиска пути: A-star и greedy BFS. Поиск пути понадобился при разработке игры Roboden - она написана на Go с использованием движка Ebitengine. Эта статья — она не про алгоритмы, а про микрооптимизации, структуры данных и прочие хитрости. Мы будем ограничивать область нашей задачи, чтобы создавать лучшие решения конкретно под неё. #article #quasilyte #gamedev

Перевод этой статьи на Хабре: https://habr.com/ru/articles/766460/

Type Inference - подробный разбор Everything You Always Wanted to Know About Type Inference - And a Little Bit More Подробнейшая статья про Type Inference от Robert Griesemer в официальном блоге разработчиков Go. Type inference — это механизм, при котором компилятор автоматически определяет тип переменной на основе того значения, которое ей присваивается. В статье разбирается: зачем это нужно, как работает и различные нюансы. #go_official

🚀 Mojo GoJo: Write Go with Emojis! https://github.com/EdmondTabaku/mojo-gojo Для поднятия настроения перед рабочим понедельн
+1
🚀 Mojo GoJo: Write Go with Emojis! https://github.com/EdmondTabaku/mojo-gojo Для поднятия настроения перед рабочим понедельником: утилита, позволяющая писать код на Go с использованием эмодзи. Выглядит забавно, подумываю затащить это дело в продакшен на работе 😄 ———— Спасибо @Len4ez за ссылку #joke #tool

Как наличие тестов влияет на скорость разработки? Имеется ввиду весь флоу разработки, т.е. Time to market. Это может быть примерная усреднённая оценка. Главное - основывайтесь на личном мнении и опыте.
Anonymous voting

Deconstructing Type Parameters https://go.dev/blog/deconstructing-type-parameters Интересный рассказ про type parameters на примере поэтапного написания собственной реализации функции Clone[S ~[]E, E any](s S) S Полезно почитать для более глубокого понимания темы #go_official

⚡️Команда Go наконец-то представила свою позицию относительно организации модуля Go Распространенный вопрос, который возникае
⚡️Команда Go наконец-то представила свою позицию относительно организации модуля Go Распространенный вопрос, который возникает у начинающих Go-разработчиков: «Как организовать проект?» с точки зрения расположения файлов и каталогов. Цель документа — предоставить некоторые рекомендации, которые помогут ответить на этот вопрос. Чтобы максимально эффективно его использовать, убедитесь, что вы знакомы с основами модулей Go.

Битва за производительность: SparseMap vs GenerationsMap https://habr.com/ru/articles/762984/ Новая статья про SparseMap, в продолжение темы предыдущих постов Вкратце, о чем пойдет речь: - используем слайс как `map[uint16]T - приходим к тому, что такой слайс дорого очищать даже с новым clear() - вспоминаем как устроен sparse map, взяв реализацию из исходников самого Go (там реализация по статье Расса Кокса) - находим узкие места в этой sparse map реализации - вводим свою новую структуру, которая для нашей задачи лучше во всех отношениях #article

Пост Искандера Шарипова из чата сообщества Геймдева на Go https://t.me/go_gamedev Думаю, вам тоже может быть интересно

Я думал, что sparse map из статьи Расса Кокса - это очень крутая альтернатива маленькой мапе. Эта реализация используется, например, внутри компилятора Go и ещё разок в паре stdlib пакетов. Но пока занимался своими геймдев-задачами, натолкнулся на то, что get и set у этого sparse map довольно медленные. Из-за чего преимущество быстрого reset иногда перекрывались. То есть: что банальный слайс, что sparse map, давали +/- одинаковое время исполнения. В одном случае reset занимал больше времени, а в другом - время исполнения росло из-за более дорогих get+set. А вот штука, описанная в статье, умеет и в мгновенный reset, и в более эффективные get+set: https://quasilyte.dev/blog/post/gen-map/ Может, вы тоже придумаете, где вам это может быть полезно.

Небольшая статья на Хабре с рассуждениями на эту тему: https://habr.com/ru/articles/762188/

Fixing For Loops in Go 1.22 https://go.dev/blog/loopvar-preview David Chase и Russ Cox в официальном блоге Go рассказывают про проблему LoopVar (переменной цикла), приводят конкретные примеры (в том числе из реального кейса проекта - Lets Encrypt). Затем рассказывают, как именно эта проблема решается. Если кратко: > change for loops to make these variables have per-iteration scope instead of per-loop scope Как вы помните, эта фича уже есть в Go v1.21, но её нужно включить: GOEXPERIMENT=loopvar go test А в версии 1.22 она уже будет работать по-умолчанию #go_1_22 #go_official

Третье издание книги "Golang для профи" Golang для профи: Создаем профессиональные утилиты, параллельные серверы и сервисы, 3-е изд Скажу честно, мне эта книга не очень зашла, но я знаю что многим она нравится. Поэтому делюсь этой новостью. Возможно, кто-то ждал обновлённое издание. ———— Это не реклама, всё же поделюсь мелкими плюшками при покупке книги на сайте издательства. Информацию взял из их почтовой рассылки: По факту оплаты бумажной версии книги на e-mail высылается электронная книга. Скидка 25% по купону — `Golang` #book

Очень крутая фича, странно что я не знал о ней всё это время. Теперь сразу забиндил хоткей забиндить на неё, точно пригодится. Я редко пользовался плэйграундом в браузере, у меня просто всегда под рукой был проект - sandbox. Но для мелочей открывать отдельный проект лениво. Тем более, в этом плэйграунде я сразу заметил ещё одну интересную фичу - когда его открываешь, в нём по дефолту будет копия текущего открытого go-файла. То есть, можно быстро поиграться с кодом, не ломая при этом оригинальный файл. Глвное - не пошэрить случайно рабочий код всеми миру 😁