Нужно ли закрывать файл? - PullRequest
0 голосов
/ 11 марта 2019

Когда я использую golang gin, считываю данные файла, используя:

file, fileHeader, err:=ctx.Request.FormFile("blabla...")

Нужно ли мне писать:

defer file.Close()

Я перехожу к исходному коду, он говорит:

// Open opens and returns the FileHeader's associated File.
func (fh *FileHeader) Open() (File, error) {
        if b := fh.content; b != nil {
                r := io.NewSectionReader(bytes.NewReader(b), 0, int64(len(b)))
                fmt.Printf("TODDLINE:152\n")
                fmt.Printf("TODDLINE:154:fmpfile:%#v\n", fh.tmpfile)
                fmt.Printf("TODDLINE:154:Filename:%#v\n", fh.Filename)
                return sectionReadCloser{r}, nil
        }
        fmt.Printf("TODDLINE:155\n")
        return os.Open(fh.tmpfile)
}

Если он использует os.Open, я полагаю, что должен закрыть файл, но если он перезапускает sectionReadCloser {r}, функция Close будет выглядеть следующим образом:

func (rc sectionReadCloser) Close() error {
        return nil
}

Функция закрытия seciontReadCloser ничего не делает. И я обнаружил, что он возвращает sectionReadCloser {r}. Я думаю, мне следует закрыть файл, но я все еще хочу знать, когда он вернет os.Open. Я буду продолжать читать исходный код и пытаться понять его. Было бы хорошо, если бы кто-нибудь дал мне совет.

1 Ответ

6 голосов
/ 11 марта 2019

Если возвращаемое file реализует io.Closer (т. Е. Если у него есть метод Close), предположим, что вы несете ответственность за его закрытие, если в документации явно не указано иное.

...