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

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

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

Обратная связь: @justskiv
Download Telegram
Самый быстрый поиск пути на 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
Шахматный движок на Go

https://github.com/rbw317/chess_go

На мой взгляд, в первую очередь, проект интересен как объект для изучения - движок не самый умный, но и код относительно простой.

Есть простенький консольный интерфейс и полноценный веб-фронтэнд. Демку с веб-версией можно потыкать тут.

Также проект может быть интересен тем, кто хочет потренироваться в написании интерфейсов на разных технологиях. К примеру, можете написать для него оболочку на том же Ebitengine.

#go_project
🔥8
GPT бот для работы с документацией Go

https://eli.thegreenplace.net/2023/retrieval-augmented-generation-in-go/

Как быть, если вы хотите спросить у GPT бота что-то по свежей документации Go, но его базы сильно устарели?

- You: what is the latest released version of the Go programming language?
- ChatGPT: As of my last update in April 2023, the latest stable version of Go
was 1.20.
- You: ...👌


Проблему можно решить с помощью Retrieval Augmented Generation (RAG), и Eli Bendersky в этой статье рассказывает как это делается. Ну и вкратце рассказывает, что такое RAG.

Если интересен только код, вот репозиторий этого проекта.

Пример ответа бота про вопрос о GOTOOLCHAIN (переменная окружения, которая появилась в Go 1.21):

In Go, `GOTOOLCHAIN` is an environment variable that determines which Go
toolchain version should be used. The value of `GOTOOLCHAIN` can be set to
various options:

1. `local`: This indicates that the bundled Go toolchain should be used.
2. `<name>`: This specifies a specific Go toolchain version that should
be used. If a binary with that name is found in the system PATH, it will be
used; otherwise, the `go` command will download and use the specified Go
toolchain.
3. `<name>+auto` or `<name>+path`: This tells the `go` command to
select and run a newer Go version as needed. It will consult the
`toolchain` and `go` lines in the current workspace's `go.work` file (or
the main module's `go.mod` file if there is no workspace) to determine
which toolchain version to use. If a newer version is specified in those
files, it will be used; otherwise, it will fallback to the default Go
toolchain.

Overall, `GOTOOLCHAIN` is used to specify the specific Go toolchain version or
the selection process of a newer Go version that should be used by the `go`
command.


#GPT #article #english
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63🔥3
Как писать параллельный код - основы

https://habr.com/ru/companies/timeweb/articles/770912/

Очень хорошая статья, в которой простым языком на простеньких примерах рассказываются основы работы с параллельным кодом:

- Зачем это нужно
- Как и почему нельзя писать параллельный код
- Какие издержки распараллеливания мы имеем (спойлер - код становится намного сложнее и опасней)
и др.

Если вы не ещё сталкивались с подобными задачами, рекомендую ознакомиться.

#article #concurrency
👍20🔥5
Какое значение выведет программа?

Не пишите ответы в комментариях, ниже есть опрос (см. следующий пост)
👍8🤔5
Какое значение выведет программа? (см. пост выше)
Anonymous Quiz
38%
Error
62%
Success
17🔥5👍3