以下代码引发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 个或基于可用内存。
1 回答
牧羊人nacy
TA贡献1862条经验 获得超7个赞
从 NextMessage 返回的 mbox 阅读器和消息阅读器对于并发访问是不安全的。由于 mbox 实现中的数据争用,程序出现恐慌。
在启动 goroutine 之前通过 slurping 消息数据来修复:
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
}
- 1 回答
- 0 关注
- 271 浏览
添加回答
举报
0/150
提交
取消