gpt4 book ai didi

go - slice 范围超出范围

转载 作者:行者123 更新时间:2023-12-01 22:40:11 27 4
gpt4 key购买 nike

以下代码引发slice bounds out of range错误。

func main()  {
file, err := os.Open("mails.mbox")
if err != nil {
log.Fatal(err)
}
defer file.Close()

m := mbox.NewReader(file) // bufio.NewScanner(file)

for {
data, err := m.NextMessage() // .Scan()
if err == io.EOF {
break
} else if err != nil {
log.Fatalf("Unexpected error after NextMessage(): %v", err)
}
go saveMessage(data)
}

// By now we should not have any messages inside.
if _, err := m.NextMessage(); err != io.EOF {
log.Fatalf("We still have data: %v", err)
}
}

func saveMessage(data io.Reader) {
msg, err := mail.ReadMessage(data)
if err != nil {
return
}
// insert msg into database
}

我想同时处理 saveMessage函数。

一次100或基于可用内存。

最佳答案

从NextMessage返回的mbox阅读器和消息阅读器对于并发访问并不安全。由于mbox实施中存在数据争用,导致程序出现紧急情况。

通过在启动goroutine之前先对消息数据进行研磨来解决:

for {
data, err := m.NextMessage() // .Scan()
if err == io.EOF {
break
} else if err != nil {
log.Fatalf("Unexpected error after NextMessage(): %v", err)
}
msg, err := mail.ReadMessage(data)
if err != nil {
log.Fatal(err)
}
go saveMessage(msg)
}

...

func saveMessage(msg *mail.Message) {
// insert msg into database
}

关于go - slice 范围超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62369020/

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