我是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)
”或者是“(f FileType)
”实现该方法。无论哪种方式都能调用该方法,但我无法覆盖f
(或者至少后续更新会丢失),从数据库读取的File
实例总是将“0”作为File.Type
的值。
您有任何关于这两个问题的想法吗?