code: func ReadPage(path string, pageID int) (*page, []byte, error) {
  	// Find page size.
  	pageSize, err := ReadPageSize(path)
  	if err != nil {
  		return nil, nil, fmt.Errorf("read page size: %s", err)
  	}
  
  	// Open database file.
  	f, err := os.Open(path)
  	if err != nil {
  		return nil, nil, err
  	}
  	defer f.Close()
  
  	// Read one block into buffer.
  	buf := make([]byte, pageSize)
  	if n, err := f.ReadAt(buf, int64(pageID*pageSize)); err != nil {
  		return nil, nil, err
  	} else if n != len(buf) {
  		return nil, nil, io.ErrUnexpectedEOF
  	}
  
  	// Determine total number of blocks.
  	p := (*page)(unsafe.Pointer(&buf[0]))
  	overflowN := p.overflow
  
  	// Re-read entire page (with overflow) into buffer.
  	buf = make([]byte, (int(overflowN)+1)*pageSize)
  	if n, err := f.ReadAt(buf, int64(pageID*pageSize)); err != nil {
  		return nil, nil, err
  	} else if n != len(buf) {
  		return nil, nil, io.ErrUnexpectedEOF
  	}
  	p = (*page)(unsafe.Pointer(&buf[0]))
  
  	return p, buf, nil
  }
docs: // ReadPage reads page info & full page data from a path.
  // This is not transactionally safe.