【发布时间】:2014-08-07 12:08:01
【问题描述】:
我是 Go 新手,我正在尝试编写一个小程序来将枚举值保存到数据库中。 我声明我的价值观的方式如下:
type FileType int64
const (
movie FileType = iota
music
book
etc
)
我在结构中使用这些值,如下所示:
type File struct {
Name string
Type FileType
Size int64
}
我将 gorp 用于我的数据库内容,但我想 gorp 的使用与我的问题无关。我把东西放在我的数据库中是这样的:
dbmap.Insert(&File{"MyBook.pdf",movie,1000})
但是当我尝试检索东西时……
dbmap.Select(&dbFiles, "select * from Files")
我收到以下错误:
panic: reflect.Set: value of type int64 is not assignable to type main.FileType
当我使用 int64 作为 const(...) 和 File.Type 字段的类型时,一切正常,但我是 Go 新手,想了解问题所在。
在我看来,我有两个问题:
- 为什么 Go 不能成功转换这些东西?我查看了 Go 反射和 sql 包的源代码,并且有这种转换的方法,但它们似乎失败了。这是一个错误吗?有什么问题?
-
我发现,可以通过实现以下方法来实现
sql.Scanner接口:Scan(src interface{}) error我尝试实现该方法,我什至能够从
src获得正确的值并将其转换为FileType,但我很困惑是否应该为“(f *FileType)或@987654334 实现该方法@. 无论哪种方式,方法都会被调用,但是我无法覆盖f(或者至少更新稍后会丢失),并且从数据库读取的File实例始终具有“0”作为 @ 的值987654337@.
你对这两点有什么想法吗?
【问题讨论】:
-
你真的不应该使用 Go 范围之外的 iota 值,例如数据库。如果您曾经对常量重新排序,或者在中间添加一个新常量,iota 值将发生变化,与数据库中的现有记录不匹配。