Golang类型断言

时间:2014-01-05 14:46:59

标签: 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

我在这里做错了什么?

2 个答案:

答案 0 :(得分:23)

这是第一个函数的工作代码:

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

答案 1 :(得分:4)

我不认为在Scan方法中修改方法(r)的接收器是个好主意。

您需要一个类型断言才能将value interface{}转换为字符串 您正在尝试将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
}

应该有效