Я новичок в 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 и sql, и есть методы для такого преобразования, но они, похоже, терпят неудачу. Это ошибка? В чем проблема?
-
Я понял, что можно реализовать интерфейс
sql.Scanner
, выполнив следующий метод:Scan(src interface{}) error
Я попытался реализовать этот метод, и даже смог получить правильное значение из
src
и преобразовать его вFileType
, но я был сбит с толку, если бы я должен реализовать метод для(f *FileType)
или(f FileType)
. В любом случае метод вызывается, однако я не могу перезаписатьf
(или, по крайней мере, обновление будет потеряно позже), а экземплярыFile
, прочитанные из БД, всегда имели значение "0" в качестве значения дляFile.Type
.
Есть ли у вас какие-либо идеи по этим двум пунктам?