为了账号安全,请及时绑定邮箱和手机立即绑定

切片边界超出范围

切片边界超出范围

Go
至尊宝的传说 2022-06-13 10:25:44
以下代码引发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

}


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 271 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信