Воспользовался вашим первым вариантом, но получил ошибку на строке return restResponse, nil
cannot use restResponse (variable of type RestResponse) as *RestResponse value in return statement
Но если использовать такую запись, то ошибка пропадает return &restResponse, nil
Я только начал изучать golang, если вас не затруднит, не могли бы объяснить в чём разница между использованием func Start() (*RestResponse, error) с указателями и "классическим" возвратом значения?
в чём разница между использованием func Start() (*RestResponse, error) с указателями и "классическим" возвратом значения?
По большому счёту, для начинающего программиста, ни в чём.
Но хорошей практикой является, обычно, возвращать вместе с ошибкой ссылочную структуру, так как при присутствии ошибки, структура будет не нужна и для того чтобы не тратить память (например у вас огромная структура), лучше вернуть nil, чем пустую структуру заполненную данными по умолчанию.
Так же, возвращаемая структура может иметь методы, которым нужно что-то записывать внутрь структуры в приватные поля, для этого данная структура должна быть ссылочной, например:
func (r *RestResponse) SetValue(value string) {
r.value = value
}
Возвращать структуру по ссылке или по значению, зависит по большому счёту, от задачи, но нужно не забывать, что структуру переданную в функцию по ссылке можно изменить через эту функцию, а переданную по значению, нет.
Если вы не уверенны, как вам нужно возвращать структуру, возвращайте всегда по ссылке.
Но для простых типов, типа int/string/bool всегда возвращайте пустое значение, а не ссылку.
Для массивов возвращайте массив без ссылки, но в return пишите nil
Евгений, ах, да, забыл главное.
При передаче структуры по ссылке (указывая &/*), мы передаём указатель на память где лежит наша структура.
При передаче по значению (когда не указываем &/*), мы копируем структуру, когда её возвращаем.