package mssql import ( "database/sql/driver" "encoding/hex" "errors" "fmt" ) type UniqueIdentifier [16]byte func (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:]) }