You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: rowseries.go
    path of file: ./repos/marketstore/utils/io
    
    the code of the file until where you have to start completion: package io

import (
	"errors"
	"fmt"
	"time"

	"github.com/alpacahq/marketstore/v4/utils/log"
)

type RowsInterface interface {
	GetRow(i int) []byte // Position to the i-th record
	GetData() []byte     // Pointer to the beginning of the data
	GetNumRows() int
	GetRowLen() int
	SetRowLen(int)
}

type RowSeriesInterface interface {
	GetMetadataKey() string // The filesystem metadata key for this data
}

type Rows struct {
	ColumnInterface
	RowsInterface
	dataShape []DataShape
	data      []byte
	rowLen    int // We allow for a rowLen that might differ from the sum of dataShape for alignment, etc
}

func NewRows(dataShape []DataShape, data []byte) *Rows {
	return &Rows{dataShape: dataShape, data
    
func (rows *Rows) GetColumn(colname string) (col interface{}) {
	var offset int
	for _, ds := range rows.GetDataShapes() {
		if ds.Name == colname {
			switch ds.Type {
			case FLOAT32:
				return getFloat32Column(offset, rows.GetRowLen(), rows.GetNumRows(), rows.GetData())
			case FLOAT64:
				return getFloat64Column(offset, rows.GetRowLen(), rows.GetNumRows(), rows.GetData())
			case INT16:
				return getInt16Column(offset, rows.GetRowLen(), rows.GetNumRows(), rows.GetData())
			case INT32:
				return getInt32Column(offset, rows.GetRowLen(), rows.GetNumRows(), rows.GetData())
			case INT64:
				return getInt64Column(offset, rows.GetRowLen(), rows.GetNumRows(), rows.GetData())
			case UINT8:
				return getUInt8Column(offset, rows.GetRowLen(), rows.GetNumRows(), rows.GetData())
			case UINT16:
				return getUInt16Column(offset, rows.GetRowLen(), rows.GetNumRows(), rows.GetData())
			case UINT32:
				return getUInt32Column(offset, rows.GetRowLen(), rows.GetNumRows(), rows.GetData())
			case UINT64:
				return getUInt64Column(offset, rows.GetRowLen(), rows.GetNumRows(), rows.GetData())
			case STRING16:
				return getString16Column(offset, rows.GetRowLen(), rows.GetNumRows(), rows.GetData())
			case BOOL, BYTE:
				return getByteColumn(offset, rows.GetRowLen(), rows.GetNumRows(), rows.GetData())
			default:
				log.Error("unexpected column type specified:", ds.Type)
			}
		} else {
			offset += ds.Type.Size()
		}
	}
	return nil
}