gpt4 book ai didi

go - 如何在打开文件的函数之外关闭文件?

转载 作者:IT王子 更新时间:2023-10-29 01:48:07 26 4
gpt4 key购买 nike

我正在尝试读取文件中的行。我想轻松打开一个文件,一次解析一行,并删除一些样板文件的打开和关闭。我正在传回指向“扫描仪”的指针。这只是一种愚蠢的方法吗?由于拆分,扫描器是否已经读取了内容?有更好的方法吗?任何关于最佳实践的见解都将受到赞赏。

    func main() {
var path string
if len(os.Args) > 1 {
err, scanner := fileScanner(path)
if err == nil {
// Go through file line by line.
for scanner.Scan() {
fmt.Println(scanner.Text())
// or do other stuff
}
// so how do I make sure to close the file?
}
}
}

// Return a scanner for a file.
func fileScanner(path string) *bufio.Scanner {
file, err := os.Open(path)
if err != nil {
return err
}
//defer file.Close()
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanLines)
return err, scanner
}

最佳答案

我认为最简单的解决方案就是不在 fileScanner 函数中打开文件。

如果从 main 函数中提取这些操作对您来说真的很重要,那么考虑创建一个新的结构类型来保存您的扫描器和文件指针,然后您可以在该类型上定义方法来打开、关闭和获取扫描器。沿着这些线的东西:

type fileScanner struct {
File *os.File
Scanner *bufio.Scanner
}

func NewFileScanner() *fileScanner {
return &fileScanner{}
}

func (f *fileScanner) Open(path string) (err error) {
f.File, err = os.Open(path)
return err
}

func (f *fileScanner) Close() error {
return f.File.Close()
}

func (f *fileScanner) GetScanner() *bufio.Scanner {
if f.Scanner == nil {
f.Scanner = bufio.NewScanner(f.File)
f.Scanner.Split(bufio.ScanLines)
}
return f.Scanner
}

func main() {
var path string
if len(os.Args) > 1 {
fscanner := NewFileScanner()
err := fscanner.Open(path)
if err == nil {
defer fscanner.Close()
scanner := fscanner.GetScanner()
// Go through file line by line.
for scanner.Scan() {
fmt.Println(scanner.Text())
// or do other stuff
}

}
}
}

为此需要做大量工作。其他替代方法是从您的函数返回文件(尽管您应该处理 panic 以避免任何可能的泄漏)或返回清理函数。

关于go - 如何在打开文件的函数之外关闭文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32544899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com