ioutil.ReadAll注意事项
现象
读取文件或者网络请求时,我们经常会遇到ioutil.ReadAll方法,但是这个方法虽然方便有时候却会导致一些性能问题。
我们往一个名为”test“的测试文件里简单写入两行字符串:
test
test
然后用我们熟知的ioutil.ReadAll来读取文件:
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
file, err := os.Open("test")
checkErr(err)
b, err := ioutil.ReadAll(file)
checkErr(err)
fmt.Println(string(b))
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}
输出:
test
test
符合我们的预期,这里我们在最后加两行输出:
fmt.Println(len(b))
fmt.Println(cap(b))
再看看输出:可以看到len只有9但是cap却有1536,我们只读取很少的内容却使用了这么多的内存,这在平时不会有问题,但是比如在网络应用当有大量请求过来时就容易导致内存严重浪费,严重时还会内存泄漏。
test
test
9
1536
溯源
我们来看看它底层到底如何读取的:ReadAll