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
posted @ 2023-01-07 23:47  ishmaelwanglin  阅读(780)  评论(0)    收藏  举报