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

这个一直有效。


    _, 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)

    }

从golang 官方博客上的示例来看,这应该是有效的语法。


编辑:更多细节和上下文

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


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



Smart猫小萌
浏览 251回答 1
1回答

繁华开满天机

事实证明,这个问题至少部分是由于竞争条件造成的。在退出函数之前我没有调用.Close()文件out。添加后我没有再遇到任何问题。为什么这会导致文件的最后一个字节有时被丢弃对我来说是个谜。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go