Подтвердить что ты не робот

Утверждение типа Голанга

Я создал тип Роль, основанный на строке, и теперь я пытаюсь заставить его работать с драйвером базы данных, реализуя интерфейсы 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

Что я здесь делаю неправильно?

4b9b3361

Ответ 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
}

должен работать