先看一段代码:
http.Get()获取数据并写入文件.
思路是将body数据全部读入内存,然后再写到目的文件中.
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
url := "/"
resp, err := http.Get(url)
if err != nil {
fmt.Printf("(url) err: %v.\n", err)
return
}
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("() err: %v.\n", err)
return
}
resp.Body.Close()
ioutil.WriteFile("", b, 0600)
}
但是当数据很大的时候,可能没办法全部读入内存,
io库中提供了一个copy方法:
io.copy(dst,src)从src读,写入dst中.
使用io.copy()代替ioutil.ReadAll()+ioutil.WriteFile(),
这样就不需要将数据先读取到内存中了.
改写之后的代码:
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
url := "/"
resp, err := http.Get(url)
if err != nil {
fmt.Printf("(url) err: %v.\n", err)
return
}
f, err := os.Create("")
if err != nil {
fmt.Printf("() err: %v.\n", err)
}
io.Copy(f, resp.Body)
resp.Body.Close()
}