golang使用json格式实现增删查改的实现示例
来源:脚本之家
2023-01-07 12:02:08
0浏览
收藏
本篇文章向大家介绍《golang使用json格式实现增删查改的实现示例》,主要包括JSON、增删查改,具有一定的参考价值,需要的朋友可以参考一下。
需求和思路
在一般的小项目或者一个小软件,例如客户端之类的小程序中,可能会需要数据的持久化.但是使用一般的数据库(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
条件查询
思路: 将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
修改操作
修改操作在查询操作的基础上实现, 修改操作需要有一个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
删除操作
最后就是删除操作了,这个比较思路简单,输入唯一的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 store
import (
"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 90 || 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的资料请关注golang学习网公众号!
版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
viper配置框架的介绍支持zookeeper的读取和监听
- 上一篇
- viper配置框架的介绍支持zookeeper的读取和监听
- 下一篇
- go语言Timer计时器的用法示例详解
查看更多
最新文章
-
- Golang · Go教程 | 5小时前 |
- Go utf8.RuneStart 怎么在字节切片中找到字符边界
- 361浏览 收藏
-
- Golang · Go教程 | 5小时前 | Context · 并发控制 · Go教程 · Cause · Err · Go 上下文取消 context.Cause 取消原因 context.Err
- Go context.Cause 和 Err 返回值为什么可能不同
- 382浏览 收藏
-
- Golang · Go教程 | 5小时前 |
- Go utf8.DecodeRuneInString 遇到非法字节时会返回什么
- 109浏览 收藏
-
- Golang · Go教程 | 5小时前 | go · utf-8 · unicode/utf8 ·
- Go unicode/utf8.ValidString 怎么判断输入是否为合法 UTF-8
- 209浏览 收藏
-
- Golang · Go教程 | 5小时前 | 事务 · go · 数据库 · commit 事务回滚 database/sql sql.Tx
- Go database/sql 事务提交失败时怎么保证回滚
- 339浏览 收藏
-
- Golang · Go教程 | 5小时前 |
- Go database/sql 查询结果不用完为什么要关闭 Rows
- 258浏览 收藏
-
- Golang · Go教程 | 12小时前 | 错误处理 · regexp · Go教程 · 配置热加载 · Go regexp.Compile 正则表达式配置 配置错误处理
- Go regexp 编译正则失败时怎么把错误交给配置层
- 222浏览 收藏
-
- Golang · Go教程 | 13小时前 |
- Go regexp.FindAllStringSubmatchIndex 怎么映射捕获组位置
- 134浏览 收藏
查看更多
课程推荐
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
查看更多
AI推荐
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 61次使用
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 216次使用
-
- C-Eval
- 深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
- 145次使用
-
- AI Prompt Library
- 探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
- 78次使用
-
- Generrated
- Generrated汇集9300+张DALL·E生成图像及对应提示词,支持查看完整图集、对比DALL·E 2与3版本差异,是AI绘图新手学习Prompt设计与获取创作灵感的实用工具。
- 55次使用
查看更多
相关文章
-
- 接口返回 200 但前端仍报错怎么办:从响应格式到跨域一步步排查
- 2026-06-14 332浏览
-
- golang生成JSON以及解析JSON
- 2023-01-17 329浏览
-
- Go如何实现json字符串与各类struct相互转换
- 2023-01-07 377浏览
-
- Go中使用gjson来操作JSON数据的实现
- 2023-01-07 141浏览
-
- Go 语言 json解析框架与 gjson 详解
- 2023-01-08 203浏览

