История изменений
Исправление proud_anon, (текущая версия) :
The list of saved calls is executed after the surrounding function returns.
когда читаю такой текст, подразумеваю, что стек вызова минусуется (очищается).
А, вот откуда ты это взял! Я всё думал, почему ты вообще решил, что тут хвостовой вызов должен оптимизироваться.
Да, с точки зрения синтаксиса языка вызов defer'нутых функций выполняется после исполнения return, при вылете из функции при панике или по достижении конца функции. Таков синтаксис языка в вакууме. Но какой машинный код должен получаться из кода на Go, в том числе, должна ли функция очищать стек перед defer'нутыми вызовами, и вообще должен ли у машины быть стек, который можно очищать, о том спецификация вообще ничего не говорит.
вот это я называю синтаксическим сахаром.
Нет, defer не всегда возможно заменить на вызов перед выходом, потому что только defer позволяет обрабатывать панику. Не говоря уже о том, что если у функции несколько точек выхода, то без defer пришлось бы повторять код перед каждой.
Исправление proud_anon, :
The list of saved calls is executed after the surrounding function returns.
когда читаю такой текст, подразумеваю, что стек вызова минусуется (очищается).
А, вот откуда ты это взял! Я всё думал, почему ты вообще решил, что тут хвостовой вызов должен оптимизироваться.
Да, с точки зрения синтаксиса языка вызов defer'нутых функций выполняется после исполнения return, при вылете из функции при панике или по достижении конца функции. Таков синтаксис языка в вакууме. Но какой машинный код должен получаться из кода на Go, в том числе, должна ли функция очищать стек перед defer'нутыми вызовами, и вообще должен ли у машины быть стек, который можно очищать, о том спецификация вообще ничего не говорит.
вот это я называю синтаксическим сахаром.
Нет, defer не всегда возможно заменить на вызов перед выходом, потому что только defer позволяет обрабатывать панику.
Исходная версия proud_anon, :
The list of saved calls is executed after the surrounding function returns.
когда читаю такой текст, подразумеваю, что стек вызова минусуется (очищается).
А, вот откуда ты это взял! Я всё думал, почему ты вообще решил, что тут хвостовой вызов должен оптимизироваться.
Да, с точки зрения синтаксиса языка вызов defer'нутых функций выполняется после исполнения return, при вылете из функции при панике или по достижении конца функции. Таков синтаксис языка в вакууме. Но какой машинный код должен получаться из кода на Go, в том числе, должна ли функция реально делать ret перед defer'нутыми вызовами, о том спецификация языка не говорит вообще ничего.