go中区别Read和ReadAt
一、os.Read()
// Read reads up to len(b) bytes from the File.
// It returns the number of bytes read and any error encountered.
// At end of file, Read returns 0, io.EOF.
func (f *File) Read(b []byte) (n int, err error) {
if err := f.checkValid("read"); err != nil {
return 0, err
}
n, e := f.read(b)
return n, f.wrapErr("read", e)
}
os.Read()传入一个buffer,返回读取多少行及错误
如果读完,则返回0和io.EOF
二、os.ReadAt()
// ReadAt reads len(b) bytes from the File starting at byte offset off.
// It returns the number of bytes read and the error, if any.
// ReadAt always returns a non-nil error when n < len(b).
// At end of file, that error is io.EOF.
func (f *File) ReadAt(b []byte, off int64) (n int, err error) {
if err := f.checkValid("read"); err != nil {
return 0, err
}
if off < 0 {
return 0, &PathError{"readat", f.name, errors.New("negative offset")}
}
for len(b) > 0 {
m, e := f.pread(b, off)
if e != nil {
err = f.wrapErr("read", e)
break
}
n += m
b = b[m:]
off += int64(m)
}
return
}
- os.ReadeAt()传入两个参数,一个是buffer(一个[]byte),一个偏移量(即偏移行数)
- 返回两个参数,一个行数,一个错误,如果读完,则返回os.EOF
三、os.Read()和os.ReadAt()区别及注意事项
1.os.Read()的四种返回状态
- 1.读取成功,返回读取多少行,err != nil
- 2.如果读取到失败了,err != nil,这个时候err返回响应的错误。
- 3.如果读取到EOF,err == EFO ,n是读到的数据大小
- 4.如果读取过程中,数据还没有准备好,返回的err 为nil;没有读满buffer,也不是EOF。此时代码不报错
2.os.ReadAt()的三种返回值状态
- 1.读取成功,返回读取多少行,err != nil
- 2.如果读取到失败了,err != nil,这个时候err返回响应的错误。
- 3.如果读取到EOF,err == EFO ,n是读到的数据大小
3.总结
- 总的来说,Read()比ReadAt()更加严格。Read使用可能会造成一定的风险。