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

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

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

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

14 ответов

48 просмотров

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

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта