go: io.ReadAll函数
ReadAll
/*
传入一个Reader接口类型值r
返回一个字节切片和错误
*/
func ReadAll(r Reader) ([]byte, error) {
// 创建一个初始切片b,长度0, 容量512
b := make([]byte, 0, 512)
for {
// 如果b的长度和容量相等,比如len = 512, cap =512
if len(b) == cap(b) {
// Add more capacity (let append pick how much).
// b的容量满时,append一个0会重新申请一段内存,并把b的内容copy过去,
// 从而获取一个新的内存地址赋值给b,使用元素截取再把0抛弃掉
b = append(b, 0)[:len(b)]
}
// b[len: cap]作为buff传入Read,读取长度为n的字节,此时b就存储了n个字节的内容
// b [len:cap]是为了每次循环保留上一次的内容
n, err := r.Read(b[len(b):cap(b)])
// b 重新赋值 b[len(b) + n] , buff的前段被保留
b = b[:len(b)+n]
if err != nil {
// 直到读到EOF, 经过数次append的b存储了全部内容,被返回给调用者
if err == EOF {
err = nil
}
return b, err
}
}
}
应用
package main
import (
"fmt"
"io"
"log"
"os"
)
func main() {
myFile := "../go.mod"
file, err := os.Open(myFile)
if err != nil {
log.Println(err)
}
defer file.Close()
buff, err := io.ReadAll(file)
if err != nil {
log.Println(err)
}
fmt.Println(string(buff))
}
打印结果
➜ src ./main
module iopack
go 1.19

浙公网安备 33010602011771号