登录
首页 >  Golang >  Go问答

切片超出边界限制

来源:stackoverflow

时间:2024-03-03 10:27:26 381浏览 收藏

哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《切片超出边界限制》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!

问题内容

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


解决方案


mbox 阅读器和从 nextmessage 返回的消息阅读器对于并发访问不安全。由于 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
}

今天关于《切片超出边界限制》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>