170 похожих чатов

Ребят, а вот есть репозиторий, у него есть метод GetUser(id

int): (*User, error)
Получается же 3 возможных состояния: пользователь найден, пользвоатель не найден, возникла ошибка в рантайме(например ошибся в sql запросе).

подскажите как Вы в таких случаях поступаете: три параметра возвращаете, каким-то механизом понимаете, где выходной error соответствует ошибке в sql запросе, а где тому, что пользователь не найден? Или может если пользователь не найден, возвращаете пустую структуру, а если ошибка, то nil?

Грубо говоря как отделяете доменные ошибки от инфраструктурных

38 ответов

12 просмотров

Определить свою ошибку ErrNotFound и вернуть её.

А "пользователь не найден" - это ошибка? Если да, то возвращать ошибку такую, а если нет, то вернуть nil, nil к примеру

Николай- Автор вопроса
Геннадий Ковалёв
Определить свою ошибку ErrNotFound и вернуть её.

И потом везде просто прокидывать ее наверх и в хендлере решать, что вывести пользователю? Просто видел, что многие через errors.Wrap на каждом этапе добаляют контекст, если с помощью errors.Wrap добавлять контекст то наверху уже не получится проверить что ошибка именно ErrNotFound

врапаем ошибку и перекидываем выше

еще надо подумать надо ли возвращать указатель (вместо значения), как правило не надо и можно сэкономить аллокацию а заодно улучшить иммутабельность кода

Николай- Автор вопроса
Viacheslav Poturaev
еще надо подумать надо ли возвращать указатель (вм...

может посоветуете статейку которую на эту тему почитать можно? Мне казалось наоборот, если возвращается ссылка, то значение не копируется и соответственно нет аллокации

Николай
может посоветуете статейку которую на эту тему поч...

в effective go написано где лучше возвращать адрес и где лучше возвращать копию

Если в двух словах, то если используется указатель, то память выделяется в куче, с последующим обслуживанием garbarge collector, что иногда медленнее. Если небольшая структура передаётся копией, то это кладётся в стэк и это может оказаться быстрее. На больших структурах наоборот.

Геннадий Ковалёв
Если в двух словах, то если используется указатель...

все параметры функций в Go (до недавнего времени) передаются через стек. и не имеет значения это структура или указатель - данные будут скопированы стек - значение имеет только размер. что касается того где будет алоцирована память - это определяет escape analysis.

Andrey S
все параметры функций в Go (до недавнего времени) ...

Я немного про другое. Про то, что лучше, передавать ли ссылку на структуру, или саму структуру.

в Go нету понятие ссылки как в C++

Andrey S
есть указатели

А p := &myvar разве не взятие ссылки? ☺️

а как же передача через регистры?

и что, пусть так, тогда указателем вы стек будете экономить, int вместо структуры

Andrey Tsvetkov
а как же передача через регистры?

Ну я про память, прошу прощения, что не пишу длинные развёрнутые юридически верефицированные тексты 😂

Тем более стек ограничен в размере. ☺️

Геннадий Ковалёв
Ну а аллокация памяти и GCне смущает?

Аллокация в любом случае будет, что в стеке выделение идет, что в куче. И вообще, если так это нравится, ковырятся, в какой именно памяти, то пишите в сях В го нет разделения на стэк и кучу

Через регистры - обычная практика

Причем тут размер физической страницы. Под стек выделяется виртуальная память

Aleksey Kourbatov
Через регистры - обычная практика

Тема вопроса коллеги была как лучше передавать структуру в функцию, как ссылку или напрямую. Через регистры ещё быстрее будет.

Aleksey Kourbatov
Причем тут размер физической страницы. Под стек в...

при том что виртуальная память состоит из страниц реальной памяти и контролировать ее расход (как и права доступа на самом деле) проще аппаратными средствами процессора, а не программным кодом

Геннадий Ковалёв
Тема вопроса коллеги была как лучше передавать стр...

через регистры не получится передать структуру целиком совсем :)

Andrey S
при том что виртуальная память состоит из страниц ...

Вы заблуждаетесь. Для стека точно такие же права, как и для кучи

Aleksey Kourbatov
Вы заблуждаетесь. Для стека точно такие же права, ...

Коллега, вы опять что-то несёте. Нам уже объясняли сегодня, что "в го нет разделения на стэк и кучу!" 😊

Больше того, если мне не изменяет склероз, до в этих ваших линуксах стек начального потока приложения при его запуске просто указывает на конец кучи

Aleksey Kourbatov
Больше того, если мне не изменяет склероз, до в эт...

cat /proc/self/maps 559538c72000-559538c74000 r--p 00000000 103:03 536872090 /usr/bin/cat 55953a665000-55953a686000 rw-p 00000000 00:00 0 [heap] 7ffd07964000-7ffd07985000 rw-p 00000000 00:00 0 [stack] склероз Вам явно изменяет :)

Геннадий Ковалёв
Коллега, вы опять что-то несёте. Нам уже объясняли...

я просто оставлю это здесь https://go.dev/doc/faq#stack_or_heap

Andrey S
cat /proc/self/maps 559538c72000-559538c74000 r--p...

но интересно что 024c4000-024e5000 rw-p 00000000 00:00 0 [heap] c000000000-c000200000 rw-p 00000000 00:00 0 c000200000-c000600000 rw-p 00000000 00:00 0 c000600000-c000800000 rw-p 00000000 00:00 0 c000800000-c004000000 ---p 00000000 00:00 0 ... 7ffc83882000-7ffc838a3000 rw-p 00000000 00:00 0 [stack] func reader(c <-chan int) { for { i := <-c fmt.Println(i, &i) } } ---- 539320 0xc00019c300

Похожие вопросы

Обсуждают сегодня

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
14
#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
Точно, оно. У тебя там имена потоков выставляются?
Александр (Rouse_) Багель
11
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Карта сайта