对于大内容的go io.copy函数中的一个错误一致

时间:2015-08-05 12:18:56

标签: go error-handling io

这个一直有效。

    _, err = io.Copy(out, resp.Body)
    if err != nil {
        ErrLog.Fatal(err)
    }

对于大型响应(MB),这个给出一个错误(下载内容的最后一个字节,在我的情况下,在json响应中为关闭])非常一致。

    if _, err := io.Copy(out, resp.Body); err != nil {
        ErrLog.Fatal(err)
    }

the examples on the official golang blog开始, 应该是有效的语法。

编辑:更多细节和背景

这是我在第二版代码中遇到的错误(更紧凑的错误处理)

ERROR: 2015/08/05 08:09:31 pull.go:257: unexpected end of JSON input

从另一个函数中的代码

err = json.Unmarshal(dat, &all_data)
if err != nil {
    return err
}

通过查看每种情况下文件的前10个和后10个字符,我发现了一个问题。这是前和后:

# Before (with error)
START:  [{"tags":[              END:    ersion":1}
START:  [{"_create              END:    "tags":[]}

# After
START:  [{"tags":[              END:    rsion":1}]
START:  [{"_create              END:    tags":[]}]

文件是15-20 Mb json字符串。

1 个答案:

答案 0 :(得分:0)

事实证明,这个问题至少部分是由于竞争条件造成的。

在退出该函数之前,我没有在文件.Close()上调用out。在补充说我没有再问题了。

为什么这会导致文件的最后一个字节被删除有时对我来说是一个谜。