切片边界超出范围

以下代码引发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 个或基于可用内存。


至尊宝的传说
浏览 258回答 1
1回答

牧羊人nacy

从 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}
打开App,查看更多内容
随时随地看视频慕课网APP