code: func (f *File) ReadAt(buf []byte, off int64) (n int, err error) {
  	size := f.Size()
  	if off >= size {
  		return 0, io.EOF
  	}
  	if n = len(buf); int64(n) > size-off {
  		n = int(size - off)
  	}
  
  	lfrag := int(uint32(off) % uint32(f.fs.BlockSize))
  	off -= int64(lfrag)
  	want := lfrag + n
  	rfrag := -want & (f.fs.BlockSize - 1)
  	want += rfrag
  
  	offb := uint32(off / int64(f.fs.BlockSize))
  
  	nblock := want / f.fs.BlockSize
  	for i := 0; i < nblock; i++ {
  		b, err := f.dblock(offb + uint32(i))
  		if err != nil {
  			return 0, err
  		}
  		dbuf, err := f.fs.readData(b, 0, nil)
  		if err != nil {
  			return 0, err
  		}
  		m := copy(buf, dbuf[lfrag:])
  		buf = buf[m:]
  		lfrag = 0
  	}
  	return n, nil
  }
docs: // ReadAt implements the io.ReaderAt interface.