Goは初めてで、列挙値をデータベースに保存する小さなプログラムを書こうとしています。値を宣言する方法は次のとおりです。
type FileType int64
const (
movie FileType = iota
music
book
etc
)
私は私の構造体でこれらの値を次のように使用します:
type File struct {
Name string
Type FileType
Size int64
}
私はデータベースにgorpを使用していますが、gorpの使用は私の問題には関係ないと思います。私はこのようなものを私のDBに入れます:
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を初めて使用して問題を理解したいと考えています。私の見方では、2つの問題があります。
sql.Scanner
次のメソッドを実装することでインターフェイスを実装できることがわかりました。
Scan(src interface{}) error
私はメソッドを実装しようとしましたが、正しい値を取得してにsrc
変換することもできましたが、FileType
" (f *FileType)
または(f FileType)
。のメソッドを実装する必要があるかどうか混乱しました。どちらの方法でもメソッドが呼び出されますが、上書きするf
(または少なくとも更新が後で失われる)File
ため、DBから読み取られたインスタンスには常にの値として「0」がありましたFile.Type
。
この2つの点について何か考えはありますか?
私は最近同じニーズがあり、解決策は2つのインターフェイスを実装することです:
これが実際の例です:
type FileType int64
func (u *FileType) Scan(value interface{}) error { *u = FileType(value.(int64)); return nil }
func (u FileType) Value() (driver.Value, error) { return int64(u), nil }
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加