大内容的 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()
。添加后,我没有再出现任何问题。
为什么这导致 文件的最后一个字节 有时被删除对我来说是个谜。
这个工作始终如一。
_, 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()
。添加后,我没有再出现任何问题。
为什么这导致 文件的最后一个字节 有时被删除对我来说是个谜。