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

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

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

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

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

38 ответов

8 просмотров

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

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

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

Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
10
А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
52
А дальше что?.. Записать в файл, потом в Код?.. И потом разбирать как-то?..
Хаскель Моисеевич Гопник
14
доброго времени. db, dw и прочие исполняются при трансляции или при выполнении программы?
lutayyy
10
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
например asm AT&T ... label: .string "hi" ... # not error lea label(%rip), %rax # error ( not compile ) mov %rip, %rax # not error mov (%rip), %rax из форумов прочитал чт...
Simple Sorcerer
6
Почему никто не подсказал, что можно объявить свои типы данных, в которых меньше полей, чем в отданном джейсоне, и добавлять их по необходимости?
Strange Rabbit
10
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
86
Есть предложения, как подобное можно упростить?
Hemul GM
12
Карта сайта