Размещение отложенного после проверки ошибок - PullRequest
0 голосов
/ 30 апреля 2018

В Go часто встречается следующая идиома:

func CopyFile(dstName, srcName string) (written int64, err error) {
    src, err := os.Open(srcName)
    if err != nil {
        return
    }
    defer src.Close()

    dst, err := os.Create(dstName)
    if err != nil {
        return
    }
    defer dst.Close()

    return io.Copy(dst, src)
}

Есть ли причина, по которой оператор defer появляется после проверки на ошибку? Я предполагаю, что это сделано для того, чтобы избежать разыменования значений nil в случае, если err не было nil.

1 Ответ

0 голосов
/ 30 апреля 2018

Если файл Open или Create завершится неудачно, значит, у вас нет действительного *File для закрытия. Проблема не будет в значении nil для *File, так как Close () проверит на nil и просто немедленно вернется в этом случае - проблема может быть в том, что значение *File не равно нулю, но недействительным. Поскольку документация для os.Open() явно не указывает, что неудачный вызов Open() возвращает значение nil для *File, нельзя полагаться на то, что все его базовые реализации действительно возвращают значение nil или всегда будут возвращать нулевое значение ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...