4utka_pyan
@4utka_pyan

Пояните пожалуйста по defer в golang?

Есть код (полностью рабочий). Интересует момент закрытия файла
package main
import "os"

func main() {
    var text string = "\nmy test string"
    // откроем файл
    fo, err := os.OpenFile("testfile22.txt", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666)
    if err != nil {panic(err)}

    // закроем файл
    defer fo.Close()

    // проверим на ошибку при закрытии файла
    defer func() {
        if err := fo.Close(); err != nil {
            panic(err)
        }
    }()

    // запись
    if _, err := fo.WriteString(text); err != nil {
        panic(err)
    }
}

Правильно я понимаю что всё что с defer выполняется в самом конце, т.е. запись WriteString происходит ещё когда файл открыт, не смотря на то, что закрытие файла стоит до этого?
Далее функций с defer две - одна на закрытие, другая на проверку ошибки при закрытии. Они все выстраиваются в конец именно в том порядке, в каком были заданы в коде?

В чём смысл использования defer, т.е. зачем откладывать выполнение на потом, ведь его можно написать ниже по коду просто? По-моему при наличии более 1 такой штуки в коде возникает реальный риск запутать себя?
  • Вопрос задан
  • 2476 просмотров
Решения вопроса 2
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
https://blog.golang.org/defer-panic-and-recover
вполне понятно описано что к чему.
Ответ написан
Комментировать
По порядку:
Да.
Нет. Укладываются на стек.
Не всегда это "ниже по коду" можно задать явно в одном месте.
Поясните вопрос.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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