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,請多多指教