Size: a a a

2020 December 08

G

Ghost in Go-go!
Daniel Podolsky
а почему не func GetUser(id int) (*SomeType, error)

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

G

Ghost in Go-go!
Марк Егоров
В одной книге по голангу написано, что если не уверены, то не используйте указатели.
Да, но вот тут само то, а просто так их пихать не стоит, да
источник

М

Марк Егоров... in Go-go!
Ghost
Боится он их, в книжке вычитал что плохо...
В книжке не написано, что плохо. Не надо придумывать. Там написано так, как я написал выше.
источник

G

Ghost in Go-go!
Можно напортачить в том, что если передать элемент и изменить его внутри функции, то он изменится за пределами этой функции. Просто нужно знать особенности и не бояться использовать.
источник

V

Vlad in Go-go!
Марк Егоров
Пока пришел к варианту такому:

Вместо:

 func GetUser(id int) (SomeType, error) 


возвращать:
 func GetUser(id int) ( []SomeType, error) 


Который уже и может быть nil, и поддается сравнению.

Мне кажется, это неплохое, масштабируемое решение
Ну это странно, что возвращается список, когда хочешь одного найти. И проверять будет сложнее
источник

G

Ghost in Go-go!
Марк Егоров
В книжке не написано, что плохо. Не надо придумывать. Там написано так, как я написал выше.
Если хочется совсем без указателей, посмотри на time.Time, там есть метод IsZero() bool, который true если тип неиницилизирован
источник

G

Ghost in Go-go!
Проверить это можно по каким нибудь приватным полям, но я бы лучше возвращал указатель. Главное просто не изменять структуру в других функциях.
источник

H

Hiroki Fujisawa in Go-go!
Там выше советовали уже IsValid() сделать
источник

H

Hiroki Fujisawa in Go-go!
который по умолчанию False и не надо мудрить с True в конструкторе
источник

D

DORIAN GRAY in Go-go!
Подскажите, почему в джейсоне возвращается пустой массив как null?
источник

G

Ghost in Go-go!
DORIAN GRAY
Подскажите, почему в джейсоне возвращается пустой массив как null?
А массив в го иницилизирован? Он будет null пока не будет сделан make([]type, 0)
источник

NL

Nikita L in Go-go!
DORIAN GRAY
Подскажите, почему в джейсоне возвращается пустой массив как null?
Потому что это скорее всего nil слайс
источник

DP

Daniel Podolsky in Go-go!
Марк Егоров
Я их побаиваюсь)
но вот возвращать указатель в вашей ситуации - общепринятая практика.
источник

М

Михаил in Go-go!
Марк Егоров
В одной книге по голангу написано, что если не уверены, то не используйте указатели.
Как раз в вашем случае они нужны
источник

AS

Alexey Shumkin in Go-go!
Ghost
Чем не подошло
func GetUser(id int) (*SomeType, error)
?

nil если юзера нет
ну, ваще есть паттерн "nil object"
https://en.wikipedia.org/wiki/Null_object_pattern

иначе потом код превращается в сплошные проверки на nil
(но гоферам к таким проверкам, собсна, не привыкать)
источник

G

Ghost in Go-go!
Alexey Shumkin
ну, ваще есть паттерн "nil object"
https://en.wikipedia.org/wiki/Null_object_pattern

иначе потом код превращается в сплошные проверки на nil
(но гоферам к таким проверкам, собсна, не привыкать)
не, ну то есть возврат одной записи как []SomeType с последующей проверкой на nil тебя устраивает больше?) У себя я возвращаю кастомную ошибку если элемента нет, но да, со звёздочкой, всёравно)
источник

AS

Alexey Shumkin in Go-go!
Ghost
не, ну то есть возврат одной записи как []SomeType с последующей проверкой на nil тебя устраивает больше?) У себя я возвращаю кастомную ошибку если элемента нет, но да, со звёздочкой, всёравно)
не,  я этого не говорил
источник

S

Sergey in Go-go!
имхо, если запрашиваешь конкретный объект и его нет (не важно по какой причине) - это всё-таки ошибка и возвращать нужно ошибку. А nil тут выглядит именно костылём. Да и не по феншую это возвращать указатели, если можно вернуть объект.
источник

AS

Andrei 🦉 Sergeev in Go-go!
в таких случаях имеет смысл сделать исходящую сигнатуру вида (User, bool, error), где bool - флаг обозначающий был ли объект найден
такой интерфейс хорошо подходит, если не хочется копаться в ошибке и создавать протечки в абстракциях чтобы понять был ли объект не найден или что еще произошло
источник

АД

Алексей Долгов... in Go-go!
Andrei 🦉 Sergeev
в таких случаях имеет смысл сделать исходящую сигнатуру вида (User, bool, error), где bool - флаг обозначающий был ли объект найден
такой интерфейс хорошо подходит, если не хочется копаться в ошибке и создавать протечки в абстракциях чтобы понять был ли объект не найден или что еще произошло
насколько огромна разница между?
if exist и if errors.Is(err, ErrNotFound)?
источник