1 回答
TA贡献1799条经验 获得超6个赞
如果您可以更改Skus字段的类型,常见的方法是声明一个实现sql.Scanner和driver.Valuer接口的切片类型并使用它而不是未命名的[]*CustomizedComponent类型。
例如:
type CustomizedItemInput struct {
Sku string `json:"sku"`
Name string `json:"name"`
Skus CustomizedComponentSlice `json:"skus"`
// ...
}
type CustomizedComponentSlice []*CustomizedComponent
// Value implements driver.Valuer interface.
func (s CustomizedComponentSlice) Value() (driver.Value, error) {
return json.Marshal(s)
}
// Scan implements sql.Scanner interface.
func (s *CustomizedComponentSlice) Scan(src interface{}) error {
var data []byte
switch v := src.(type) {
case string:
data = []byte(v)
case []byte:
data = v
default:
return nil
}
return json.Unmarshal(data, s)
}
如果您无法更改Skus字段类型,则必须在扫描期间显式转换字段。
例如,给定上述命名的切片类型,您可以执行以下操作:
v := new(CustomizedItemView)
row := db.QueryRow("SELECT sku, name, skus FROM customized_item_view WHERE sku = ? LIMIT 1", sku)
err := row.Scan(
&v.Sku,
&v.Name,
// do the conversion here, and any other place where you're scanning Skus...
(*CustomizedComponentSlice)(&v.Skus),
)
if err != nil {
return err
}
fmt.Println(v.Skus) // result
- 1 回答
- 0 关注
- 96 浏览
添加回答
举报