Есть код (полностью рабочий). Интересует момент закрытия файла
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 такой штуки в коде возникает реальный риск запутать себя?