成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

golang使用json格式實現增刪查改的實現示例

瀏覽:170日期:2024-05-30 15:52:53

需求和思路

在一般的小項目或者一個小軟件,例如客戶端之類的小程序中,可能會需要數據的持久化.但是使用一般的數據庫(Mysql)之類的不合適.使用sqlite3這種嵌入式的是個較好的方法,但是Go語言中sqlite3的庫是C語言的,Cgo不支持跨平臺編譯.正是由于這種需求,才想到使用json格式將數據直接保存在文件中.具體的思路是怎么樣呢? 在Go語言中如果要將數據轉化成json格式的話,有兩種格式 struct 和 map. 如果同時需要增刪查改功能的話,將map作為中間格式是比較合適的.接下來我們就來實現它.

查詢操作

這種操作的實現比較簡單,直接將文件中的數據讀取出來,使用json庫反序列化就可以了. 代碼如下 :

type Product struct { Name string `json:'name'` Num int `json:'num'`}func findAll() { ps := make([]Product, 0) data, err := ioutil.ReadFile('./index.json') if err != nil { log.Fatal(err) } // 這里參數要指定為變量的地址 err = json.Unmarshal(data, &ps) if err != nil { log.Fatal(err) } fmt.Println(ps)}

添加操作

添加的實現實在查詢的基礎上的,我們需要先查詢文件中的數據庫,并轉化為map格式,再將struct也轉化為map格式(這里要使用反射),合并map,json序列化,最后保存在文件中.代碼如下:

func create() { fields := make([]map[string]interface{}, 0) p1 := &Product{ Name: 'Blog', Num: 2, } _, _ = json.Marshal(p1) // 讀取文件中的數據,保存為map格式 data, _ := ioutil.ReadFile('./index.json') err := json.Unmarshal(data, &fields) if err != nil { log.Fatal(err) } // 使用反射將struct轉化為map tp := reflect.TypeOf(p1).Elem() vp := reflect.ValueOf(p1).Elem() field := make(map[string]interface{}, 0) for i := 0; i < tp.NumField(); i++ { field1 := tp.Field(i) field2 := vp.Field(i) key := field1.Tag.Get('json') field[key] = field2.Interface() } // 合并map fields = append(fields, field) // 寫入文件 out, _ := json.Marshal(fields) _ = ioutil.WriteFile('./index.json', out, 0755)}

條件查詢

思路: 將struct轉化為map,根據輸入的條件查詢.查詢的結果轉化為struct.代碼如下:

func FindOne() { product := &Product{} p1 := &Product{ Name: 'John', Num: 23, } // 使用反射將struct轉化為map tp := reflect.TypeOf(p1).Elem() vp := reflect.ValueOf(p1).Elem() field := make(map[string]interface{}, 0) for i := 0; i < tp.NumField(); i++ { field1 := tp.Field(i) field2 := vp.Field(i) key := field1.Tag.Get('json') switch field2.Kind() { case reflect.Int: field[key] = float64(field2.Interface().(int)) case reflect.Int8: field[key] = float64(field2.Interface().(int8)) case reflect.Int16: field[key] = float64(field2.Interface().(int16)) case reflect.Int32: field[key] = float64(field2.Interface().(int32)) case reflect.Int64: field[key] = float64(field2.Interface().(int64)) case reflect.Uint: field[key] = float64(field2.Interface().(uint)) case reflect.Uint8: field[key] = float64(field2.Interface().(uint8)) case reflect.Uint16: field[key] = float64(field2.Interface().(uint16)) case reflect.Uint32: field[key] = float64(field2.Interface().(uint32)) case reflect.Uint64: field[key] = float64(field2.Interface().(uint64)) case reflect.Float32: field[key] = float64(field2.Interface().(float32)) case reflect.Float64: field[key] = field2.Interface() default: field[key] = field2.Interface() } } _, _ = json.Marshal(p1) // 讀取文件中的數據,保存為map格式 // 數據轉化為map時,數值類型的統一變成float64 data, _ := ioutil.ReadFile('./index.json') fields := make([]map[string]interface{}, 0) err := json.Unmarshal(data, &fields) if err != nil { log.Fatal(err) } // 查詢的條件 columns := []string{'name', 'num'} length := len(columns) for _, item := range fields { for i := 0; i < length; i++ { // 這里的比較需要改進 if item[columns[i]] != field[columns[i]] {break } if i == length-1 {field = itemgoto OVER } } }OVER: fmt.Println(field) out, _ := json.Marshal(field) _ = json.Unmarshal(out, &product) fmt.Println(product)}

修改操作

修改操作在查詢操作的基礎上實現, 修改操作需要有一個id值,能確定元素的唯一性.代碼如下:

func Update() { p1 := &Product{ Id: '2bbec87025968879c3c9682abe3bf730', Name: 'John_e', Num: 100, } // 使用反射將struct轉化為map tp := reflect.TypeOf(p1).Elem() vp := reflect.ValueOf(p1).Elem() field := make(map[string]interface{}, 0) for i := 0; i < tp.NumField(); i++ { field1 := tp.Field(i) field2 := vp.Field(i) key := field1.Tag.Get('json') switch field2.Kind() { case reflect.Int: field[key] = float64(field2.Interface().(int)) case reflect.Int8: field[key] = float64(field2.Interface().(int8)) case reflect.Int16: field[key] = float64(field2.Interface().(int16)) case reflect.Int32: field[key] = float64(field2.Interface().(int32)) case reflect.Int64: field[key] = float64(field2.Interface().(int64)) case reflect.Uint: field[key] = float64(field2.Interface().(uint)) case reflect.Uint8: field[key] = float64(field2.Interface().(uint8)) case reflect.Uint16: field[key] = float64(field2.Interface().(uint16)) case reflect.Uint32: field[key] = float64(field2.Interface().(uint32)) case reflect.Uint64: field[key] = float64(field2.Interface().(uint64)) case reflect.Float32: field[key] = float64(field2.Interface().(float32)) case reflect.Float64: field[key] = field2.Interface() default: field[key] = field2.Interface() } } _, _ = json.Marshal(p1) // 讀取文件中的數據,保存為map格式 // 數據轉化為map時,數值類型的統一變成float64 data, _ := ioutil.ReadFile('./index.json') fields := make([]map[string]interface{}, 0) err := json.Unmarshal(data, &fields) if err != nil { log.Fatal(err) } // 修改的條件 columns := []string{'name', 'num'} for _, v := range fields { if v['_id'] == field['_id'] { for _, col := range columns {v[col] = field[col] } field = v } } out, _ := json.MarshalIndent(fields, '', ' ') _ = ioutil.WriteFile('./index.json', out, 0755)}

刪除操作

最后就是刪除操作了,這個比較思路簡單,輸入唯一的id值,刪除對應的字段,再保存到文件就可以了.代碼如下:

func Delete() { p1 := &Product{ Id: 'db43fa2d4f69cddce7494941cb36032b', Name: 'John_e', Num: 100, } _, _ = json.Marshal(p1) // 讀取文件中的數據,保存為map格式 // 數據轉化為map時,數值類型的統一變成float64 data, _ := ioutil.ReadFile('./index.json') fields := make([]map[string]interface{}, 0) err := json.Unmarshal(data, &fields) if err != nil { log.Fatal(err) } length := len(fields) for index, field := range fields { if field['_id'] == p1.Id { if index == length - 1 {fields = fields[0:index] } else {fields = append(fields[0:index], fields[index+1:]...) } } } out, _ := json.MarshalIndent(fields, '', ' ') _ = ioutil.WriteFile('./index.json', out, 0755)}

完整版

最后在附上完整版代碼:

package storeimport ( 'bytes' 'crypto/md5' 'encoding/json' 'errors' 'fmt' 'io/ioutil' 'os' 'path/filepath' 'reflect' 'strings' 'time')type Store struct { Dir string}func NewStore(dir string) (*Store, error) { // .開頭的為相對路徑,補全為全路徑 if strings.HasPrefix(dir, '.') { pwd, _ := os.Getwd() dir = filepath.Join(pwd, dir) } store := &Store{Dir: dir} st, err := os.Stat(dir) if err != nil { err = os.Mkdir(dir, 0755) if err != nil { return nil, err } } else if st != nil && !st.IsDir() { return nil, errors.New('file already exists') } return store, nil}// 創建與結構體對應的json文件func (s *Store) Sync(values ...interface{}) error { for _, v := range values { tb := parseTn(v) if tb == '' { return errors.New('does not find store') } _path := filepath.Join(s.Dir, tb) _, err := os.Stat(_path) if err != nil { _ = ioutil.WriteFile(_path, []byte('[]'), 0755) } } return nil}// 刪除所有func (s *Store) Destroy() error { return os.RemoveAll(s.Dir)}func (s *Store) FindAll(v interface{}) error { _path, err := s.before(v) if err != nil { return err } out, err := s.readAll(_path) if err != nil { return err } err = json.Unmarshal(out, &v) return err}func (s *Store) FindOne(v interface{}, columns ...string) (interface{}, error) { _path, err := s.before(v) if err != nil { return nil, err } data, err := s.readAll(_path) if err != nil { return nil, err } fields := make([]map[string]interface{}, 0) err = json.Unmarshal(data, &fields) if err != nil { return nil, err } m := structToMap(v) length := len(columns) for _, item := range fields { for i := 0; i < length; i++ { // TODO 這里的比較需要改進 if item[columns[i]] != m[columns[i]] {break } if i == length-1 {m = itemgoto OVER } } }OVER: err = mapToStruct(m, &v) if err != nil { return nil, err } return v, nil}func (s *Store) Create(v interface{}) error { _path, err := s.before(v) if err != nil { return err } data, err := s.readAll(_path) if err != nil { return err } fields := make([]map[string]interface{}, 0) err = json.Unmarshal(data, &fields) if err != nil { return err } m := structToMap(v) m['_id'] = randId() fields = append(fields, m) err = s.writeAll(_path, fields) if err != nil { return err } err = mapToStruct(m, v) if err != nil { return err } return nil}func (s *Store) Update(v interface{}, columns ...string) error { _path, err := s.before(v) if err != nil { return err } data, err := s.readAll(_path) if err != nil { return err } fields := make([]map[string]interface{}, 0) err = json.Unmarshal(data, &fields) if err != nil { return err } m := structToMap(v) for _, v := range fields { if v['_id'] == m['_id'] { for _, col := range columns {v[col] = m[col] } m = v } } err = s.writeAll(_path, fields) if err != nil { return err } return nil}func (s *Store) Delete(v interface{}) error { _path, err := s.before(v) if err != nil { return err } data, err := s.readAll(_path) if err != nil { return err } fields := make([]map[string]interface{}, 0) err = json.Unmarshal(data, &fields) if err != nil { return err } m := structToMap(v) length := len(fields) for index, field := range fields { if field['_id'] == m['_id'] { if index == length-1 {fields = fields[0:index] } else {fields = append(fields[0:index], fields[index+1:]...) } } } err = s.writeAll(_path, fields) if err != nil { return err } return nil}func (s *Store) Clean(v interface{}) error { _path, err := s.before(v) if err != nil { return err } return os.Remove(_path)}func (s *Store) readAll(file string) ([]byte, error) { out, err := ioutil.ReadFile(file) if err != nil { return nil, err } return out, nil}func (s *Store) writeAll(file string, v interface{}) error { out, err := json.MarshalIndent(v, '', ' ') if err != nil { return err } err = ioutil.WriteFile(file, out, 0755) if err != nil { return err } return nil}func (s *Store) before(v interface{}) (string, error) { tb := parseTn(v) if tb == '' { return '', errors.New('invalid table name') } _path := filepath.Join(s.Dir, tb) _, err := os.Stat(_path) if err != nil { return '', err } return _path, nil}func structToMap(v interface{}) map[string]interface{} { tp := reflect.TypeOf(v).Elem() vp := reflect.ValueOf(v).Elem() field := make(map[string]interface{}, 0) for i := 0; i < tp.NumField(); i++ { field1 := tp.Field(i) field2 := vp.Field(i) key := field1.Tag.Get('json') field[key] = field2.Interface() switch field2.Kind() { case reflect.Int: field[key] = float64(field2.Interface().(int)) case reflect.Int8: field[key] = float64(field2.Interface().(int8)) case reflect.Int16: field[key] = float64(field2.Interface().(int16)) case reflect.Int32: field[key] = float64(field2.Interface().(int32)) case reflect.Int64: field[key] = float64(field2.Interface().(int64)) case reflect.Uint: field[key] = float64(field2.Interface().(uint)) case reflect.Uint8: field[key] = float64(field2.Interface().(uint8)) case reflect.Uint16: field[key] = float64(field2.Interface().(uint16)) case reflect.Uint32: field[key] = float64(field2.Interface().(uint32)) case reflect.Uint64: field[key] = float64(field2.Interface().(uint64)) case reflect.Float32: field[key] = float64(field2.Interface().(float32)) case reflect.Float64: field[key] = field2.Interface() default: field[key] = field2.Interface() } } return field}func mapToStruct(m map[string]interface{}, v interface{}) error { out, err := json.Marshal(m) if err != nil { return err } return json.Unmarshal(out, &v)}func toSnake(s string) string { out := bytes.Buffer{} bName := []byte(s) point := 0 for index, b := range bName { // 非大寫,不需要轉化 if b < 65 || b > 90 || index-point < 2 { out.WriteByte(b) continue } // 首字符大寫,直接轉化為小寫 if index == 0 { out.WriteByte(b + 32) point = index } // 連續三個大寫,觸發轉化 if index-point >= 2 { out.WriteByte(95) out.WriteByte(b + 32) point = index } } return out.String()}func parseTn(v interface{}) string { var name string tp := reflect.TypeOf(v).Elem() switch tp.Kind() { case reflect.Ptr: sp := strings.Split(tp.String(), '.') name = sp[len(sp)-1] case reflect.Slice: sp := strings.Split(tp.String(), '.') name = sp[len(sp)-1] case reflect.Struct: name = tp.Name() } name = toSnake(name) return name + '.json'}func randId() string { return fmt.Sprintf('%x', md5.Sum([]byte(time.Now().String())))}

到此這篇關于golang使用json格式實現增刪查改的實現示例的文章就介紹到這了,更多相關golang json增刪查改內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品99一区二区| 午夜精品福利在线| 亚洲成a天堂v人片| 尤物网精品视频| 亚洲欧美在线aaa| 欧美视频官网| 国产精品久久久久久久久图文区 | 中文一区在线| 亚洲欧洲中文日韩久久av乱码| 欧美日韩国产三区| 国产色综合一区| 欧美激情综合色综合啪啪| 久久久精品免费网站| 91亚洲精品一区二区乱码| 欧美大尺度电影在线| 国产成人激情av| 日韩欧美在线观看一区二区三区| 国产高清不卡一区二区| 91精品国产综合久久精品性色 | 亚洲美女视频一区| 日韩午夜视频在线观看| 亚洲综合色视频| 蘑菇福利视频一区播放| 视频一区二区欧美| 欧美日韩午夜在线| 成人午夜在线播放| 精品国产乱码久久久久久久久| 99vv1com这只有精品| 国产欧美精品一区aⅴ影院| 欧美久久在线| 依依成人综合视频| 色伊人久久综合中文字幕| 国内精品自线一区二区三区视频| 欧美日韩国产乱码电影| 国产高清在线精品| 日韩精品一区二区三区蜜臀| 99re成人精品视频| 国产人久久人人人人爽| 精品1区2区3区4区| 亚洲午夜激情网站| 欧美亚洲丝袜传媒另类| 国产成人在线视频免费播放| 久久久久久**毛片大全| 国产精品a久久久久| 一区二区不卡在线播放 | 国产精品久久久久aaaa| 亚洲国产精品久久久久久女王| 亚洲成人精品一区二区| 欧美日韩一级二级| 99久久777色| 亚洲精品一二三| 色菇凉天天综合网| 成人小视频在线观看| 国产精品久久看| 久久精彩视频| 国产精品1区2区3区在线观看| 久久综合色播五月| 亚洲免费黄色| 九九热在线视频观看这里只有精品| 日韩午夜激情视频| 国内综合精品午夜久久资源| 亚洲3atv精品一区二区三区| 欧美系列在线观看| 欧美一区二区三区免费看| 亚洲人精品午夜| 在线亚洲欧美专区二区| 国产电影一区二区三区| 国产精品午夜春色av| 免费国产一区二区| 成人污视频在线观看| 亚洲免费在线电影| 欧美日韩久久一区二区| 欧美黄色精品| 亚洲综合一区二区精品导航| 欧美午夜片在线观看| 91亚洲大成网污www| 一区二区高清在线| 91精品国产综合久久精品app | 欧美性做爰猛烈叫床潮| 成人高清免费观看| 一区二区三区精品在线观看| 欧美一区二区视频在线观看2022| 欧美jjzz| 日韩精品亚洲一区二区三区免费| 亚洲精品在线一区二区| 99亚洲视频| 懂色av一区二区夜夜嗨| 亚洲在线观看免费视频| 日韩欧美国产综合一区| 99av国产精品欲麻豆| 国模少妇一区二区三区| 亚洲欧洲日韩综合一区二区| 欧美巨大另类极品videosbest | 噜噜噜噜噜久久久久久91 | 99久久综合精品| 三级欧美韩日大片在线看| www精品美女久久久tv| 久久精品主播| 欧美成人亚洲| 水蜜桃久久夜色精品一区的特点| 精品国产区一区| 蘑菇福利视频一区播放| 97se亚洲国产综合在线| 日韩国产欧美三级| 国产精品视频你懂的| 欧美日韩国产一区二区三区地区| 亚洲欧洲一区| 不卡一区中文字幕| 日本人妖一区二区| 亚洲欧洲精品天堂一级| 欧美大片拔萝卜| 久久一区精品| 亚洲青色在线| 成人精品视频一区| 奇米888四色在线精品| 国产精品高清亚洲| 欧美电影免费观看高清完整版在线| 国产精品一卡| 欧美日韩精品免费看| 国产黑丝在线一区二区三区| 亚洲成人手机在线| 国产精品国模大尺度视频| 91精品国产色综合久久不卡电影| 午夜亚洲一区| 亚洲高清自拍| 97久久精品人人澡人人爽| 国产精品一区二区久久精品爱涩 | 欧美猛男超大videosgay| 国产欧美日韩综合一区在线观看| 91视频.com| 国产.精品.日韩.另类.中文.在线.播放| 午夜视黄欧洲亚洲| 亚洲乱码国产乱码精品精的特点 | 欧美无砖砖区免费| 一区二区黄色| 91亚洲精品一区二区乱码| 国产美女视频91| 日韩国产欧美在线播放| 亚洲一线二线三线视频| 国产精品久久久久久久蜜臀| 精品久久久久久综合日本欧美| 在线观看视频欧美| 久久久国产精品一区二区三区| 亚洲茄子视频| 好吊一区二区三区| 91色在线porny| 成人app网站| 国产成人在线免费| 国产一区二区在线视频| 美女久久久精品| 亚洲h在线观看| 亚洲影视在线观看| 亚洲乱码一区二区三区在线观看| 久久久不卡影院| 久久综合九色综合欧美就去吻| 在线播放亚洲一区| 欧美曰成人黄网| 老司机免费视频久久| 国产农村妇女精品一二区| 91久久亚洲| 精久久久久久| 好吊一区二区三区| 在线成人www免费观看视频| 国产精品v欧美精品v日韩精品| 欧美一区不卡| 91视频精品在这里| 91麻豆福利精品推荐| 欧美一区二区| 欧美高清日韩| 国产精品xvideos88| 欧美日本国产| 国语对白精品一区二区| 狠狠色噜噜狠狠色综合久| 岛国一区二区在线观看| 中文字幕制服丝袜一区二区三区| 成人精品一区二区三区中文字幕 | 国产在线不卡一区| 国产在线乱码一区二区三区| 久久国产剧场电影| 日本成人中文字幕在线视频| 五月激情综合婷婷| 日本在线不卡视频| 另类小说视频一区二区| 国产麻豆视频一区二区| 国产乱人伦精品一区二区在线观看| 国产自产v一区二区三区c| 国产成人在线看| 99久久国产综合精品色伊| 91麻豆精品一区二区三区| 91丨九色丨黑人外教| 欧美精品麻豆| 一本色道精品久久一区二区三区 | 国产精品久久99| 亚洲视频在线一区| 亚洲午夜电影在线| 伊人久久大香线蕉av超碰演员| 91性感美女视频| 精品一区二区在线免费观看| 欧美久久久久久久久| 国产一区二区不卡|