| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 | package mssqlimport (	"database/sql/driver"	"encoding/hex"	"errors"	"fmt")type UniqueIdentifier [16]bytefunc (u *UniqueIdentifier) Scan(v interface{}) error {	reverse := func(b []byte) {		for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {			b[i], b[j] = b[j], b[i]		}	}	switch vt := v.(type) {	case []byte:		if len(vt) != 16 {			return errors.New("mssql: invalid UniqueIdentifier length")		}		var raw UniqueIdentifier		copy(raw[:], vt)		reverse(raw[0:4])		reverse(raw[4:6])		reverse(raw[6:8])		*u = raw		return nil	case string:		if len(vt) != 36 {			return errors.New("mssql: invalid UniqueIdentifier string length")		}		b := []byte(vt)		for i, c := range b {			switch c {			case '-':				b = append(b[:i], b[i+1:]...)			}		}		_, err := hex.Decode(u[:], []byte(b))		return err	default:		return fmt.Errorf("mssql: cannot convert %T to UniqueIdentifier", v)	}}func (u UniqueIdentifier) Value() (driver.Value, error) {	reverse := func(b []byte) {		for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {			b[i], b[j] = b[j], b[i]		}	}	raw := make([]byte, len(u))	copy(raw, u[:])	reverse(raw[0:4])	reverse(raw[4:6])	reverse(raw[6:8])	return raw, nil}func (u UniqueIdentifier) String() string {	return fmt.Sprintf("%X-%X-%X-%X-%X", u[0:4], u[4:6], u[6:8], u[8:10], u[10:])}
 |