我想要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