以下代碼引發(fā)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條經(jīng)驗 獲得超7個贊
從 NextMessage 返回的 mbox 閱讀器和消息閱讀器對于并發(fā)訪問是不安全的。由于 mbox 實現(xiàn)中的數(shù)據(jù)爭用,程序出現(xiàn)恐慌。
在啟動 goroutine 之前通過 slurping 消息數(shù)據(jù)來修復:
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 關注
- 323 瀏覽
添加回答
舉報
0/150
提交
取消
