Implement Scan with a type switch

This is just a minor (and a bit opinionated) tweak in Scan. While using
the generated Scan method, realized that what's being returned from any
driver I've stumbled upon is actually []byte instead of string, thus
always causing a one failed type assertion on Scan.
This commit is contained in:
Kiril Vladimiroff 2020-03-05 16:18:52 +02:00
parent d46c853929
commit 78ada3fc29
No known key found for this signature in database
GPG Key ID: E8AC87A89B24A670
2 changed files with 31 additions and 25 deletions

View File

@ -1682,14 +1682,16 @@ func (i *Prime) Scan(value interface{}) error {
return nil return nil
} }
str, ok := value.(string) var str string
if !ok { switch v := value.(type) {
bytes, ok := value.([]byte) case []byte:
if !ok { str = string(b)
return fmt.Errorf("value is not a byte slice") case string:
} str = v
case fmt.Stringer:
str = string(bytes[:]) str = v.String()
default:
return fmt.Errorf("invalid value of Prime: %[1]T(%[1]v)", value)
} }
val, err := PrimeString(str) val, err := PrimeString(str)
@ -1867,14 +1869,16 @@ func (i *Prime) Scan(value interface{}) error {
return nil return nil
} }
str, ok := value.(string) var str string
if !ok { switch v := value.(type) {
bytes, ok := value.([]byte) case []byte:
if !ok { str = string(b)
return fmt.Errorf("value is not a byte slice") case string:
} str = v
case fmt.Stringer:
str = string(bytes[:]) str = v.String()
default:
return fmt.Errorf("invalid value of Prime: %[1]T(%[1]v)", value)
} }
val, err := PrimeString(str) val, err := PrimeString(str)

20
sql.go
View File

@ -12,21 +12,23 @@ const scanMethod = `func (i *%[1]s) Scan(value interface{}) error {
return nil return nil
} }
str, ok := value.(string) var str string
if !ok { switch v := value.(type) {
bytes, ok := value.([]byte) case []byte:
if !ok { str = string(b)
return fmt.Errorf("value is not a byte slice") case string:
} str = v
case fmt.Stringer:
str = string(bytes[:]) str = v.String()
default:
return fmt.Errorf("invalid value of %[1]s: %%[1]T(%%[1]v)", value)
} }
val, err := %[1]sString(str) val, err := %[1]sString(str)
if err != nil { if err != nil {
return err return err
} }
*i = val *i = val
return nil return nil
} }