Size: a a a

2021 June 20

RT

Rostislav Teryaev in Go-go!
Ну то есть (p Point)
источник

A

Artur in Go-go!
работает
источник

A

Artur in Go-go!
меня больше волнует вопрос: почему?!
источник

A

Artur in Go-go!
по логике и мой код должен работать
источник

A

Artur in Go-go!
без именования выходного параметра
источник

RT

Rostislav Teryaev in Go-go!
Согласен.
источник

RT

Rostislav Teryaev in Go-go!
Не знаю,  в чем причина такого решения была
источник

Z

Zver in Go-go!
Потому что параметры для ретерна формируются до дефера.
источник

AK

Andrey Kartashov in Go-go!
у тебя p в main() и p внутри test() - разные
источник

Z

Zver in Go-go!
Сначала копируются параметры в переменные возврата, затем вызывается дефер и потом данные переменных возврыты возвращаются из функции.
источник

AK

Andrey Kartashov in Go-go!
если хочешь, чтобы менялось, возвращай из test ссылку
источник

Z

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

AK

Andrey Kartashov in Go-go!
а вот на это рассчитывать не стоит, потому что внутри test() может быть явный return, который возвращает не p
источник

Z

Zver in Go-go!
Такой порядок выполнения фактический

func test() (Point) {
p := Point{1, 2}
defer test2(&p)

  // Реальный порядок выполнения
  result := p
  test2(&p)
return result
}
источник

АП

Александр Попов... in Go-go!
но эта техника для коротких функций! делать именованные переменные возврата для длинных это не читабельно
источник

Z

Zver in Go-go!
Все нормально работает, если приваевать именованному возвращаемому параметру по ссылке. Проверено на обработке ошибок. Даже где-то в гугловой документации или блоге такой механизи приведен.
источник

AK

Andrey Kartashov in Go-go!
это понятно, но для внешнего пользователя функции это может быть неочевидно
источник

AK

Andrey Kartashov in Go-go!
поэтому так делать не очень хорошо, лучше явно ссылку возвращать
источник

Z

Zver in Go-go!
Внешенуму пользователю и знать не надо как работает.
источник

AK

Andrey Kartashov in Go-go!
то-то он будет гадать, почему иногда меняется, иногда нет :)
источник