gorm 结构
type Thgl struct { Model Code string `gorm:"size(10);index:pre_idx" json:"code"` Next MyJson `json:"next"` //子Bom Files MyJson `json:"files"` //文件 Glass MyJson `json:"glass"` //玻璃参数 ->价格 } //增加图号 func AddThgl(data map[string]interface{}, name string) (int, error) { str := Thgl{ Code: data["code"].(string), Next: MyJson{data["next"]}, Files: MyJson{data["files"]}, Glass: MyJson{data["glass"]}, } err := db.Create(&str).Error return str.ID, err } //更改图号 func EditThgl(data map[string]interface{}) error { data["next"] = MyJson{data["next"]} data["files"] = MyJson{data["files"]} data["glass"] = MyJson{data["glass"]} err := db.Model(&Thgl{}).Updates(data).Error return err }
创建自定义类型
type MyJson struct { v interface{} } // 写入数据库之前,对数据做类型转换 func (s MyJson) Value() (driver.Value, error) { b, err := json.Marshal(s.v) return string(b), err } // 将数据库中取出的数据,赋值给目标类型 func (s *MyJson) Scan(v interface{}) error { var err error var data_ map[string]interface{} var data []map[string]interface{} fmt.Println(v, string(v.([]byte))) switch vt := v.(type) { case string: err = json.Unmarshal([]byte(vt), &s.v) case []byte: if vt[0] == 91 { err = json.Unmarshal(vt, &data) *s = MyJson{data} //s.v = data } else { err = json.Unmarshal(vt, &data_) //s.v = data_ *s = MyJson{data_} } default: return errors.New("myjson 转换错误") } return err } // 自定义类型上实现 Marshaler 的接口, 在进行 Marshal 时就会使用此除的实现来进行 json 编码 func (s MyJson) MarshalJSON() ([]byte, error) {
// 可以自由调整精度
//if float64(f) == float64(int(f)) {
// return []byte(strconv.FormatFloat(float64(f), 'f', 2, 64)), nil //} //return []byte(strconv.FormatFloat(float64(f), 'f', -1, 64)), nil*/ b, err := json.Marshal(s.v) fmt.Println(b, string(b)) return b, err } /* func (t *MyJson) UnmarshalJSON(b []byte) error { b = bytes.Trim(b, "\"") ext, err := time.Parse(t.UnmarshalTimeFormat(), string(b)) if err != nil { // do something } *t = ExTime{ext} return nil } */
初学go,请多多指教