Самый быстрый поиск пути на Go без аллокаций и СМС
https://habr.com/ru/articles/766882/
Искандер рассказывает про алгоритмы поиска пути: A-star и greedy BFS. Поиск пути понадобился при разработке игры Roboden - она написана на Go с использованием движка Ebitengine.
Эта статья не про алгоритмы, а про микрооптимизации, структуры данных и прочие хитрости. Мы будем ограничивать область нашей задачи, чтобы создавать лучшие решения конкретно под неё.
#article #quasilyte #gamedev
https://habr.com/ru/articles/766882/
Искандер рассказывает про алгоритмы поиска пути: A-star и greedy BFS. Поиск пути понадобился при разработке игры Roboden - она написана на Go с использованием движка Ebitengine.
Эта статья не про алгоритмы, а про микрооптимизации, структуры данных и прочие хитрости. Мы будем ограничивать область нашей задачи, чтобы создавать лучшие решения конкретно под неё.
#article #quasilyte #gamedev
Хабр
Самый быстрый поиск пути на Go без аллокаций и СМС
Алгоритмы важны. Но реализовать их можно очень по-разному. При одном и том же алгоритме, оптимизированная библиотека будет в тысячу раз быстрее наивной. Любите оптимизации, специализированные...
🔥13👍7❤2
Прокачали логгер, теперь взялись за HTTP-роутер
https://eli.thegreenplace.net/2023/better-http-server-routing-in-go-122/
- Proposal
- Документация
Пример кода:
1. В первом хэнделере мы видим явное указание HTTP-метода (GET)
2. Во втором - компонент
За ссылку спасибо @batazor
#go_updates #http #mux
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
👍18❤2🔥2
Используете ли вы глобальный логгер? Речь про рабочие проекты, серьезные пет-проекты и т.п.
И поделитесь в комментариях своим опытом - нравится ли вам такой подход? Почему?
И поделитесь в комментариях своим опытом - нравится ли вам такой подход? Почему?
Anonymous Poll
36%
Да, везде (или почти везде)
14%
Иногда
21%
Не использую
29%
Не знаю / Посмотреть ответы
👍5
Golang Дайджест
Прокачали логгер, теперь взялись за 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() …
Хабр
Улучшенная маршрутизация HTTP-серверов в Go 1.22
В Go 1.22 ожидается появление интересного предложения - расширение возможностей по поиску шаблонов (pattern-matching) в мультиплексоре, используемом по умолчанию для обслуживания HTTP в пакете...
🔥9👍5
Advanced gRPC Error Usage
https://jbrandhorst.com/post/grpc-errors/
Коротенькая статья о том, как с помощью пакета status добавлять произвольные метаданные к ошибкам. Это бывает очень удобно при разборе и обработке ошибок между сервисами.
Пример:
————
За ссылку спасибо @ekostogorov
#grpc #article
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
Go Ahead
Advanced gRPC Error Usage
How to best handle errors in Go is a divisive issue, leading to opinion pieces by illustrious bloggers such as Dave Cheney, the commander himself Rob Pike as well as the official Go blog. I’m not going to tackle those opinions here, instead I’m going to talk…
👍9❤2
Forwarded from Selectel Team
Как дебажить concurrency-код в Go?
Сергей Петров, разработчик IAM, собрал инструменты, которые вам для этого пригодятся.
Неочевидности в Go, завязка библиотек на процессор, скедулинг горутин — обо всем этом смотрите в докладе!
Сергей Петров, разработчик IAM, собрал инструменты, которые вам для этого пригодятся.
Неочевидности в Go, завязка библиотек на процессор, скедулинг горутин — обо всем этом смотрите в докладе!
👍35
Шахматный движок на Go
https://github.com/rbw317/chess_go
На мой взгляд, в первую очередь, проект интересен как объект для изучения - движок не самый умный, но и код относительно простой.
Есть простенький консольный интерфейс и полноценный веб-фронтэнд. Демку с веб-версией можно потыкать тут.
Также проект может быть интересен тем, кто хочет потренироваться в написании интерфейсов на разных технологиях. К примеру, можете написать для него оболочку на том же Ebitengine.
#go_project
https://github.com/rbw317/chess_go
На мой взгляд, в первую очередь, проект интересен как объект для изучения - движок не самый умный, но и код относительно простой.
Есть простенький консольный интерфейс и полноценный веб-фронтэнд. Демку с веб-версией можно потыкать тут.
Также проект может быть интересен тем, кто хочет потренироваться в написании интерфейсов на разных технологиях. К примеру, можете написать для него оболочку на том же Ebitengine.
#go_project
GitHub
GitHub - rbw317/chess_go: Chess engine written in Go
Chess engine written in Go. Contribute to rbw317/chess_go development by creating an account on GitHub.
🔥8
GPT бот для работы с документацией Go
https://eli.thegreenplace.net/2023/retrieval-augmented-generation-in-go/
Как быть, если вы хотите спросить у GPT бота что-то по свежей документации Go, но его базы сильно устарели?
Проблему можно решить с помощью Retrieval Augmented Generation (RAG), и Eli Bendersky в этой статье рассказывает как это делается. Ну и вкратце рассказывает, что такое RAG.
Если интересен только код, вот репозиторий этого проекта.
Пример ответа бота про вопрос о GOTOOLCHAIN (переменная окружения, которая появилась в Go 1.21):
#GPT #article #english
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
👍6❤3🔥3
Как писать параллельный код - основы
https://habr.com/ru/companies/timeweb/articles/770912/
Очень хорошая статья, в которой простым языком на простеньких примерах рассказываются основы работы с параллельным кодом:
- Зачем это нужно
- Как и почему нельзя писать параллельный код
- Какие издержки распараллеливания мы имеем (спойлер - код становится намного сложнее и опасней)
и др.
Если вы не ещё сталкивались с подобными задачами, рекомендую ознакомиться.
#article #concurrency
https://habr.com/ru/companies/timeweb/articles/770912/
Очень хорошая статья, в которой простым языком на простеньких примерах рассказываются основы работы с параллельным кодом:
- Зачем это нужно
- Как и почему нельзя писать параллельный код
- Какие издержки распараллеливания мы имеем (спойлер - код становится намного сложнее и опасней)
и др.
Если вы не ещё сталкивались с подобными задачами, рекомендую ознакомиться.
#article #concurrency
Хабр
Здоровая конкуренция в GO. Главное не перехитрить самого себя
Несколько лет назад я прочитал статью о параллелизации в GO и ничего не понял – я тогда только начинал программировать на этом языке. Но размышления автора мне очень понравились – они подкреплялись...
👍20🔥5
❤17🔥5👍3