gpt4 book ai didi

go - 将指针传递给 bufio.Scanner()

转载 作者:IT王子 更新时间:2023-10-29 02:28:58 24 4
gpt4 key购买 nike

以免我提供an XY problem ,我的目标是在多个 goroutine 之间共享一个内存映射文件 as recommended .每个 goroutine 都需要逐行遍历文件,所以我希望先将完整的内容存储在内存中以加快速度。

我尝试过的方法是将指针传递给 bufio.Scanner,但这不起作用。我认为这可能与需要将搜索位置设置回文件开头有关,但它甚至第一次都不起作用,我在文档中找不到这样的参数。我的尝试是创建此函数,然后通过引用我打算在 goroutine 中运行的函数来传递结果(现在,我使用 goroutines 只是为了确保这完全有效,但事实并非如此。

这是一个 MWE:

// ... package declaration; imports; yada yada

func main() {
// ... validate path to file stored in filePath variable
filePath := "/path/to/file.txt"

// get word list scanner to be shared between goroutines
scanner := getScannerPtr(&filePath)

// pass to function (no goroutine for now, I try to solve one problem at a time)
myfunc(scanner)
}

func getScannerPtr(filePath *string) *bufio.Scanner {
f, err := os.Open(*filePath)
if err != nil {
fmt.Fprint(os.Stderr, "Error opening file\n")
panic(err)
}
defer f.Close()
scanner := bufio.NewScanner(f)
scanner.Split(bufio.ScanLines)
return scanner
}

func myfunc(scanner *bufio.Scanner) {
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
// ... do something with line
}
}

我没有收到任何错误,它只是在我调用 Scan() 时没有遍历文件,所以它永远不会在该 block 内对文件的每一行执行任何操作。请记住,我什至还没有使用并发,这只是我想指出的最终目标,以防影响我需要采用的方法。

  • 为什么 Scan() 不工作?
  • 如果我打算在将来调用 go myfunc(scanner),这是一种可行的方法吗?

最佳答案

在使用 Scanner 之前关闭文件:

func getScannerPtr(filePath *string) *bufio.Scanner {
f, err := os.Open(*filePath)
if err != nil {
fmt.Fprint(os.Stderr, "Error opening file\n")
panic(err)
}
defer f.Close() // <--- Here
scanner := bufio.NewScanner(f)
scanner.Split(bufio.ScanLines)
return scanner // <-- File gets closed, then Scanner that tries to read it is returned for further use, which won't work
}

因为 Scanner 不公开 Close,所以您需要解决这个问题;最快的可能是使用几个嵌入式字段制作一个简单的自定义类型:

type FileScanner struct {
io.Closer
*bufio.Scanner
}

func getScannerPtr(filePath *string) *FileScanner {
f, err := os.Open(*filePath)
if err != nil {
fmt.Fprint(os.Stderr, "Error opening file\n")
panic(err)
}
scanner := bufio.NewScanner(f)
return &FileScanner{f, scanner}
}

func myfunc(scanner *FileScanner) {
defer scanner.Close()
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
// ... do something with line
}
}

关于go - 将指针传递给 bufio.Scanner(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48026422/

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