Golang Дайджест
7.87K subscribers
36 photos
1 file
165 links
Самое интересное из мира Go: новости, статьи, проекты, сервисы, изменения в языке и др.

Посты публикуются не часто - только самое важное, с чем я лично ознакомился.

Поэтому можно не мьютить канал =)

Обратная связь: @justskiv
Download Telegram
Forwarded from quasilyte senpai
Я думал, что sparse map из статьи Расса Кокса - это очень крутая альтернатива маленькой мапе.

Эта реализация используется, например, внутри компилятора Go и ещё разок в паре stdlib пакетов.

Но пока занимался своими геймдев-задачами, натолкнулся на то, что get и set у этого sparse map довольно медленные. Из-за чего преимущество быстрого reset иногда перекрывались.

То есть: что банальный слайс, что sparse map, давали +/- одинаковое время исполнения. В одном случае reset занимал больше времени, а в другом - время исполнения росло из-за более дорогих get+set.

А вот штука, описанная в статье, умеет и в мгновенный reset, и в более эффективные get+set:
https://quasilyte.dev/blog/post/gen-map/

Может, вы тоже придумаете, где вам это может быть полезно.
👍92
Битва за производительность: SparseMap vs GenerationsMap

https://habr.com/ru/articles/762984/

Новая статья от Искандера Шарипова про SparseMap, в продолжение темы предыдущих постов

Вкратце, о чем пойдет речь:

- используем слайс как `map[uint16]T
- приходим к тому, что такой слайс дорого очищать даже с новым clear()
- вспоминаем как устроен sparse map, взяв реализацию из исходников самого Go (там реализация по статье Расса Кокса)
- находим узкие места в этой sparse map реализации
- вводим свою новую структуру, которая для нашей задачи лучше во всех отношениях

#article #quasilyte
👍11
⚡️Команда Go наконец-то представила свою позицию относительно организации модуля Go

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

Цель документа — предоставить некоторые рекомендации, которые помогут ответить на этот вопрос. Чтобы максимально эффективно его использовать, убедитесь, что вы знакомы с основами модулей Go.
🔥52👍6🤔2
Deconstructing Type Parameters

https://go.dev/blog/deconstructing-type-parameters

Интересный рассказ про type parameters на примере поэтапного написания собственной реализации функции Clone[S ~[]E, E any](s S) S

Полезно почитать для более глубокого понимания темы

#go_official
👍9
Как наличие тестов влияет на скорость разработки?

Имеется ввиду весь флоу разработки, т.е. Time to market. Это может быть примерная усреднённая оценка. Главное - основывайтесь на личном мнении и опыте.
Anonymous Poll
18%
Точно ускоряет разработку
21%
Скорее ускоряет
5%
Не влияет на скорость
22%
Скорее замедляет
11%
Точно замедляет
23%
Не знаю / Посмотреть ответы
🚀 Mojo GoJo: Write Go with Emojis!

https://github.com/EdmondTabaku/mojo-gojo

Для поднятия настроения перед рабочим понедельником: утилита, позволяющая писать код на Go с использованием эмодзи.

Выглядит забавно, подумываю затащить это дело в продакшен на работе 😄
————

Спасибо @Len4ez за ссылку

#joke #tool
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁24👍54🤔1
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
👍104
Самый быстрый поиск пути на Go без аллокаций и СМС

https://habr.com/ru/articles/766882/

Искандер рассказывает про алгоритмы поиска пути: A-star и greedy BFS. Поиск пути понадобился при разработке игры Roboden - она написана на Go с использованием движка Ebitengine.

Эта статья не про алгоритмы, а про микрооптимизации, структуры данных и прочие хитрости. Мы будем ограничивать область нашей задачи, чтобы создавать лучшие решения конкретно под неё.

#article #quasilyte #gamedev
🔥13👍72
Прокачали логгер, теперь взялись за 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 #mux
👍182🔥2
Используете ли вы глобальный логгер? Речь про рабочие проекты, серьезные пет-проекты и т.п.

И поделитесь в комментариях своим опытом - нравится ли вам такой подход? Почему?
Anonymous Poll
36%
Да, везде (или почти везде)
14%
Иногда
21%
Не использую
29%
Не знаю / Посмотреть ответы
👍5
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
👍92
Forwarded from Selectel Team
Как дебажить concurrency-код в Go?

Сергей Петров, разработчик IAM, собрал инструменты, которые вам для этого пригодятся.

Неочевидности в Go, завязка библиотек на процессор, скедулинг горутин — обо всем этом смотрите в докладе!
👍35