Утверждение типа Голанга
Я создал тип Роль, основанный на строке, и теперь я пытаюсь заставить его работать с драйвером базы данных, реализуя интерфейсы Valuer и Scanner
type Role string
func (r *Role) Scan(value interface{}) error {
r = (*Role)(value.(string))
return nil
}
func (r *Role) Value(value driver.Value, err error) {
if err != nil {
value = string(r)
}
}
Я продолжаю получать ошибку:
The Go code app/entities/user.go does not compile: cannot convert value.(string) (type string) to type *Role
Что я здесь делаю неправильно?
Ответы
Ответ 1
Вот рабочий код для первой функции:
func (r *Role) Scan(value interface{}) error {
*r = Role(value.(string))
return nil
}
Хотя вы можете использовать s, ok := value.(string)
и возвращать ошибку для !ok
вместо паники.
Подпись для a driver.Valuer
не то, что вы дали, но:
func (r Role) Value() (driver.Value, error) {
return string(r), nil
}
Обратите внимание, что это не обрабатывает или не производит значения NULL.
Playground
Ответ 2
Я не думаю, что это хорошая идея, чтобы изменить приемник вашего метода (r) в методе сканирования.
Вам нужно утверждение типа для преобразования value interface{}
в строку.
Вы пытаетесь преобразовать a string
в pointer to Role
.
func (r *Role) Scan(value interface{}) (retVal Role, err error) {
var s string;
if v,ok := value.(string); ok {
s = v;
}
var rx Role
rx = Role(s)
var rx2 *Role
rx2 = &rx
_ = rx // just to silence the compiler for this demonstration
_ = rx2 // just to silence the compiler for this demonstration
return rx, nil
}
должен работать