一尘不染

Golang类型断言

go

我已经创建了一个基于字符串的角色类型,现在我想通过实现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

我在这里做错了什么?


阅读 240

收藏
2020-07-02

共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

2020-07-02