我需要将结构中的一个字符串类型字段转换为切片。
我正在使用GORM进行查询。有问题的字段以JSON类型存储在MySQL中。
以下是一个存储在其中一个DB记录中的JSON示例:
[“tag1”, “tag2”, “tag3”]
我在果朗的结构体:
type Mystruct struct {
Id int
Name string
Desc string
Tags string // this is problem
}
我生成这样的结构:
mystruct := []Mystruct{}
db.Find(&mystruct)
一切都很好,除了我希望"标签"是一个切片,而不是字符串。如果我使用,GORM会抛出错误
Tags []string
我也试过做
Tags datatypes.JSON
包含在GORM中,但只返回字节。
我主要想访问html模板中的标签并在其中循环。
感谢您的帮助。非常感谢。
如果希望db.Find(&mystruct)
执行解组,则必须使用实现Scanner
接口的自定义类型。
例如
type StringSlice []string
func (ss *StringSlice) Scan(src interface{}) error {
switch data := src.(type) {
case []byte:
return json.Unmarshal(data, ss)
case string:
return json.Unmarshal([]byte(data), ss)
}
return nil // or an error
}
然后更新你的类型
type Mystruct struct {
Id int
Name string
Desc string
Tags StringSlice
}
如果您将Mystruct
用于INSERT
和UPDATE
,那么您还必须实现Valuer
接口,否则保存这样的实例可能会中断。
func (ss StringSlice) Value() (driver.Value, error) {
return json.Marshal(ss)
}