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

Consistent off by one errors in go io.copy function for large content

这个工作始终如一。

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

对于大型响应,此错误给出了相当一致的错误(下载内容的最后一个字节被遗漏,在我的例子中,json 响应中的结束 ]) (MB).

    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 个字符串。

事实证明,这个问题至少部分是竞争条件的结果。

我在退出函数之前没有在文件 out 上调用 .Close()。添加后,我没有再出现任何问题。

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