ioutil源码解读1

这个是ioutil暴露的方法

func ReadAll(r io.Reader) ([]byte, error) {
	return readAll(r, bytes.MinRead)
}

func readAll(r io.Reader, capacity int64) (b []byte, err error) {
	buf := bytes.NewBuffer(make([]byte, 0, capacity)) //创建一个缓冲的buf
	defer func() {
		e := recover()//读取错误
		if e == nil {
			return//没有错误退出defer函数
		}
		if panicErr, ok := e.(error); ok && panicErr == bytes.ErrTooLarge {
			err = panicErr
		} else {
			panic(e)
		}
	}()
	_, err = buf.ReadFrom(r) //调用方法
	return buf.Bytes(), err
}
func ReadFile(filename string) ([]byte, error) {
	f, err := os.Open(filename)//打开文件
	if err != nil {
		return nil, err
	}
	defer f.Close()

	var n int64

	if fi, err := f.Stat(); err == nil {
		// 读取他的文件大小另外不能让他太大
		if size := fi.Size(); size < 1e9 {
			n = size
		}
	}

	return readAll(f, n+bytes.MinRead)//调用方法
}

猜你喜欢

转载自my.oschina.net/u/1766862/blog/1647314