Golang类型断言
我已经创建了一个基于字符串的类型角色,现在我正试图通过实现Valuer和Scanner接口使它与数据库驱动程序一起工作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 {
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)
我明白了,只是忽略了第二个返回值。