我想要func OpenFile()來讀取gzip文件和bzip2文件。我將在稍後添加其他類型。如何在打開文件並在另一個函數中創建NewReader後關閉文件?
func OpenFile(name string) io.Reader{
file, err := os.Open(name)
if err != nil {
log.Fatal(err)
}
if(strings.Contains(name, ".gz")){
gzip, gerr := gzip.NewReader(file)
if gerr != nil {
log.Fatal(gerr)
}
return gzip
}else if(strings.Contains(name, ".bz2")){
bzip2 := bzip2.NewReader(file)
return bzip2
}else{
return file
}
}
我打電話的OpenFile()中的另外一個功能:
in := OpenFile(p)
for _, d := range fdb.Detect(in) {
set[d] = true
counter++
}
...
我的問題是,如果我使用 「推遲file.Close()」 中的OpenFile(),該文件將被關閉太早,所以我無法獲得任何輸入值。如何關閉A中的文件?
請注意,gzip.NewReader(文件)和bzip2.NewReader(文件)返回不同的接口。
的gzip:FUNC NewReader(R io.Reader)(*閱讀器,錯誤)//讀取器有一個FUNC關閉()
的bzip2:FUNC NewReader(R io.Reader)io.Reader // IO。閱讀器沒有func關閉()
這就是我無法首先返回NewReader(文件)的原因。
謝謝!
相關/可能重複(https://stackoverflow.com/questions/28279155/using-defer-with-pointers/28279237#28279237)。 – icza