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

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

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

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

14 ответов

43 просмотра

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

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта