Golang类型断言

Golang类型断言,go,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 {

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

我做错了什么?

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

您需要一个类型断言来将
值接口{}
转换为字符串。
您正在尝试将
字符串
转换为指向角色的
指针

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
}

应该工作

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

func (r *Role) Scan(value interface{}) error {
    *r = Role(value.(string))
    return nil
}
尽管您可能希望使用
s,但ok:=value.(string)
并为
返回一个错误!正常
而不是惊慌失措

a
驾驶员.估价师的签名不是您给出的,而是:

func (r Role) Value() (driver.Value, error) {
    return string(r), nil
}
注意,这不会处理或产生空值


如果我们没有修改接收器或返回一个值,那么驱动程序怎么办?接收器r
与对象中的
类似。您可以在Go中返回多个值(值和错误)。我现在不知道您对扫描方法有什么要求。是的,但扫描的任务是将从数据库返回的字符串转换为角色,该角色被分配给rx,而不是r,并且不会返回,只有局部变量才能获得结果。我缺少一些内容。扫描程序接口将扫描定义为
scan(src interface{})error
如果您返回多个结果,则除了返回一个错误外,不能返回任何其他内容。你能提供一个到你的扫描器接口的API文档的链接,这样我就可以查到它是关于什么的吗?啊哈,这是指针的取消引用引起了我的注意。第二个解决方案是
func(r*Role)Value(Value driver.Value,err error){if err!=nil{Value=string(*r)}
,这很有趣。我从未见过修改方法接收器的Go代码,也不会考虑这样做。我还确信,从接口到具体类型的转换需要一个类型断言。有一个类型断言,
value.(string)
我明白了,只是忽略了第二个返回值。