Go 希望使用传递到库的相同文件内容,而无需打开文件两次

Go 希望使用传递到库的相同文件内容,而无需打开文件两次,go,io,Go,Io,我正在使用库gopkg.in/freeev/pgn.v1读取特定于国际象棋游戏的“pgn”格式的文本文件。它在其NewPGNScanner的引擎盖下使用text/scanner 不幸的是,它没有提供从pgn文件中获取输入的简单方法,因此我单独将所有文件内容拉入缓冲区,并将其转换为字符串片段,以便与NewPGNScanner(我很清楚潜在的内存问题,但文件很小,每次通过游戏内容时我都会从切片中取出,从而不断减少内存消耗): 请注意注释掉的行。如果没有它,pgnContent.Next()的上不会发

我正在使用库
gopkg.in/freeev/pgn.v1
读取特定于国际象棋游戏的“pgn”格式的文本文件。它在其
NewPGNScanner
的引擎盖下使用
text/scanner

不幸的是,它没有提供从pgn文件中获取输入的简单方法,因此我单独将所有文件内容拉入缓冲区,并将其转换为字符串片段,以便与
NewPGNScanner
(我很清楚潜在的内存问题,但文件很小,每次通过游戏内容时我都会从切片中取出,从而不断减少内存消耗):

请注意注释掉的行。如果没有它,pgnContent.Next()的
上不会发生迭代;我的程序需要注释进去才能按我喜欢的方式进行。因此,
buf.ReadFrom(f)
似乎干扰了库在引擎罩下使用的
文本/扫描仪

我在谷歌上搜索了一下,没有找到任何正确的答案。这个被接受的答案要求使用
ioutil.ReadFile
,当然它会再次读取该文件——实际上我的方法是基于对同一个问题的投票率较低的答案:


我还开始在上阅读文档,但没有详细说明如何实现某种“倒带”无需再次调用文件上的
os.Open
。我认为它可能在那里,我认为这将为将来有类似需求的任何人提供有用的问答,谢谢。

似乎是最简单的解决方案,在使用
buf.ReadFrom(f)
从文件中读取字节后,如下所示:

// f, err = os.Open("../before_fide_master.pgn")
f.Seek(0, 0)

多亏了mkopriva。我在谷歌上搜索并找到了
f.Seek(0,0)
这里的技巧:

你有没有考虑过在打开的文件上使用
Seek
呢?@mkopriva谢谢,我现在可以自己回答这个问题。还有多个并发读卡器。请注意,如果在两次读卡操作之间基础文件发生了变化,那么读取一次文件,再查找,再读取可能会得到不同的数据。所以我的操作系统禁止这样做,有些允许这样做,而在那些允许这样做的操作系统上,文件很可能不会被更改,因此,如果这不是一个问题,而且这是一个简单的解决方案,那么就这样做吧。:-)
// f, err = os.Open("../before_fide_master.pgn")
f.Seek(0, 0)