170 похожих чатов

Привет! Кто может обьяснить как этот сниппет работает? Чем defer

в данном случае отличается от классической рекурсии и какие тут затраты по памяти?

func PrintReversedSlice[T any](slice []T) {
for _, value := range slice {
defer fmt.Print(value)
}
}

14 ответов

25 просмотров

Деферы срабатывают в обратном порядке вызова

Egor-Chistiakov Автор вопроса
Roman 🎄
Деферы срабатывают в обратном порядке вызова

это я понимаю, а где они хранятся? что в памяти и на стеке происходит?

When there are multiple deferred statements in the same function, they are stored and executed as a stack. Получается сброс параметров стека каждый раз когда вызов defer, тогда это даёт доп расходы на выполнение, значит такой код работает, но очень не оптимально https://www.sohamkamani.com/golang/defer/ Хотя не ясно как там происходит внутри тут сказано как стек, но насчёт куда они складываются? Я только предполагаю что в стек

Egor-Chistiakov Автор вопроса
Eugene Sol
When there are multiple deferred statements in the...

интуиция подсказывает что defer это синтаксический сахар для рекурсии

Egor-Chistiakov Автор вопроса

а линтеры говорят, что так писать вообще не стоит Possible resource leak, 'defer' is called in the 'for' loop Inspection info: Reports defer statements inside loops. Using defer in loops can lead to resource leaks or unpredictable execution order of statements. Example: func main() { for { field, err := db.Query("SELECT 1") if err != nil { // ... } defer field.Close() // ... } } Calls of defer row.Close() inside the loop are not executed until the function completes its execution. Not at the end of each step of the for loop. Such implementation might lead to overflow of the function's stack and other issues.

Egor Chistiakov
интуиция подсказывает что defer это синтаксический...

Чет я идею вашу не пойму, причем тут рерурсия если рекурсия это вызов себя, а дефер какую-то другую функцию

Egor-Chistiakov Автор вопроса
Артём Лазаренко
Чет я идею вашу не пойму, причем тут рерурсия если...

я пытаюсь разобраться как работает этот код https://t.me/gogolang/704685 он похож на рекурсию, ведет себя как рекурсия, занимает память на стеке как рекурсия, но при этом рекурсией не является

Egor Chistiakov
я пытаюсь разобраться как работает этот код https:...

Не ведёт он себя как рекурсия, просто создали много деферов

Конечно кладется. В случае с циклом Go не может заинлайнить вызов по определению по сколько количество итераций определяется в рантайме

Egor-Chistiakov Автор вопроса

а что такое дефер? что делает рантайм когда я вызываю defer func() ?

Egor-Chistiakov Автор вопроса
Alexandr Sokolov
Конечно кладется. В случае с циклом Go не может за...

то есть он не выходя за пределы стеково фрейма PrintReversedSlice подкидывает туда вызовы какой-то фукнции с аргументами? А как это может произойти в рантайме стек же должен быть определен еще до запуска программы? или компилятор этот цикл еще на этапе компиляции выполил?

Egor Chistiakov
а что такое дефер? что делает рантайм когда я вызы...

Не могу знать, буду признателен если кто-нибудь кинет статейку. Был бы в го try finally я б сказал что дефер это стек функций (стек в данном случае структура данных) которую выполняет рантайм в блоке finally

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Блин, интересно, кто-нибудь когда-нибудь переписывал какую-нибудь игру с x86 на arm? Вообще, такое возможно?
Alan 🔝 Бэброу
13
I just installed it but how do I use it?
Talula
12
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
здравствуйте, у меня есть число шестнадцаттиричное, FFFB например, это -5, как мне в консоль вывести -5? мой самописный atoi преобразовывает -5 в 65531
Maxim Of course
7
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Карта сайта