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

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

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

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

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

38 ответов

16 просмотров

Определить свою ошибку 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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта