Именованный Go возвращает параметры

В Go вы можете писать функции с именованными параметрами результата.

Два примера изспецификация:

func complexF3() (re float64, im float64) {
    re = 7.0
    im = 4.0
    return
}

func (devnull) Write(p []byte) (n int, _ error) { n = len(p) return }

Использование этого синтаксиса дает ряд преимуществ.

Вам не нужно вручную выделять возвращаемые переменные, поскольку, имея их в качестве типов результатов, они автоматически инициализируются нулевым значением для своего типа при запуске функции.

Именованные возвращаемые параметры очень хорошо справляются с ролью неявной документации: вы знаете, что функция возвращает, прямо из своей подписи, поскольку именование вещей помогает понять код.

Если есть несколько точек выхода из функции, вам не нужно записывать все параметры, простоreturn(называетсяголый возврат). Ты все ещеможетперечислите возвращаемые значения явно, и, вероятно, вам следует это сделать, чтобы код не читался. Как предложено вЯзык программирования Go:

[…] Со многими операторами возврата и несколькими результатами, простые возвраты могут уменьшить дублирование кода, но они редко облегчают понимание кода. […] Возвраты без покрытия лучше всего использовать с осторожностью.

Пример:

func something(n int) (ret int, m string, err error) {
    if n == 0 {
        err = errors.New("Houston, we have a problem!")
        return 0, "", err
    }
<span style="color:#a6e22e">ret</span> = <span style="color:#a6e22e">n</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">100</span>
<span style="color:#a6e22e">m</span> = <span style="color:#e6db74">"Congratulations"</span>

<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">ret</span>, <span style="color:#a6e22e">m</span>, <span style="color:#a6e22e">err</span>

}

или с голыми доходами:

func something(n int) (ret int, m string, err error) {
    if n == 0 {
        err = errors.New("Houston, we have a problem!")
        return
    }
<span style="color:#a6e22e">ret</span> = <span style="color:#a6e22e">n</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">100</span>
<span style="color:#a6e22e">m</span> = <span style="color:#e6db74">"Congratulations"</span>

<span style="color:#66d9ef">return</span>

}

В обоих случаях код чище и читабельнее, чем

func something(n int) (int, string, error) {
    var ret int
    var m string
<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">n</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span> {
    <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">errors</span>.<span style="color:#a6e22e">New</span>(<span style="color:#e6db74">"Houston, we have a problem!"</span>)
    <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">ret</span>, <span style="color:#a6e22e">m</span>, <span style="color:#a6e22e">err</span>
}

<span style="color:#a6e22e">ret</span> = <span style="color:#a6e22e">n</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">100</span>
<span style="color:#a6e22e">m</span> = <span style="color:#e6db74">"Congratulations"</span>

<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">ret</span>, <span style="color:#a6e22e">m</span>, <span style="color:#66d9ef">nil</span>

}

Остерегайтесь риска затенения параметра новым объявлением внутри функции.

Итак, когда вы должны их использовать? Когда это имеет смысл для вас в общем дизайне программы. Я позволюЯзык программирования Goответьте цитатой:

[…] Не всегда необходимо называть несколько результатов исключительно для документации. Например, соглашение гласит, что окончательныйboolрезультат указывает на успех; анerrorчасто не требует объяснений.


Дополнительные ресурсы:


Больше руководств по go: