2013-12-01 2 views
1

Если у меня есть функция, которая выглядит как этотя всегда должен возвращать значение даже в случае ошибки

func ThisIsMyComplexFunc() (ComplexStruct, error) 

где ComplexStruct является большой структурой, которая, как правило, содержат грузы значений.

Что делать, если функция наткнулась на ошибку прямо в начале, прежде чем я даже начал строить свою структуру, в идеале я бы хотел только вернуть ошибку, например.

return nil, err 

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

Есть ли способ обойти это?

+0

Рассмотрите статью [«Обработка ошибок и переход»] (http://blog.golang.org/error-handling-and-go). – kostix

ответ

3

Если ваша функция объявлена ​​для возврата двух значений, вам нужно будет вернуть два значения.

Один из вариантов, которые могли бы упростить код, чтобы использовать именованные возвращаемые значения:

func ThisIsMyComplexFunc() (s ComplexStruct, err error) { 
    ... 
} 

Теперь вы можете просто присвоить s и/или err, а затем использовать голую return заявление. Вы все равно будете возвращать значение ComplexStruct, но вам не нужно его инициализировать вручную (по умолчанию оно будет равным нулю).

2

Вы можете вернуть указатель на структуру:

func ThisIsMyComplexFunc() (*ComplexStruct, error) { 
    ... 
    if somethingIsWrong { 
    return nil, err 
    } 
    ... 
    return &theStructIBuilt, nil 
} 

В общем, это будет дешевле передать большие по указателю структур в любом случае, потому что это проще скопировать указатель, чем вся структура.

Смежные вопросы