```
func main() {
fileName :="./test.jpg"
file, _ := os.Create(fileName)
url :="https://alifei05.cfp.cn/creative/vcg/veer/800water/veer-140775274.jpg"
resp, err := http.Get(url)
defer resp.Body.Close()
if err!=nil {
log.Fatal("http get error:",err)
}
writer := bufio.NewWriter(file)
for {
c := make([]byte, 1024)
n, err := resp.Body.Read(c)
if err!=nil{
log.Fatal("read error:",err)
}
fmt.Println(n)
if n< len(c) {
goto loop
}
writer.Write(c[:n])
//1\ 此处flush,下载图片成功
writer.Flush()
}
loop:
//2\ 此处flush,下载图片失败,丢失数据严重
//writer.Flush()
fmt.Println("下载完成")
}
```
**关于bufio的writer,见上面的1处和2处位置的不同。为何每写一个slice,就要flush下才能成功;最后只flush一次,下载的就会有问题。
我看writer.Write(c[:n])的源码如下:**
![image.png ](https://static.studygolang.com/210829/6b657bb7bb5fad71d9efcb2ea6effc0d.png)
**其中已经flush过了啊,有些疑惑,请大神们指点一下。**
认真读一下 Reader interface 的说明, 当网络数据准备好 0 <= n <= len(c), read 也会返回
真正eof 是要判断err == EOF
你循环里面注释掉flush就会导致循环太快,网络来不及下载数据给你读就跳出了循环
#1
更多评论
```
url :="https://avatars.githubusercontent.com/u/87457873?v=4&s=48"
```
goto是错误的,最后n个字节没写入
有图有真相
![2021-09-06_081534.jpg](https://static.studygolang.com/210906/2d9407e23bf14d298a9cc20cb9d65396.jpg)
按字节比较原图与goto下载的图
![cmp.jpg](https://static.studygolang.com/210906/b3b1b7a442615ae911562846dc433c50.jpg)
#2