需求说明
代办事项小程序,是模仿手机上 "提醒事项功能" 用Go做的几个简单的增删改查操作,包括信息的持久化存储采用json格式存储、代办事项时间过期则不能被修改等特性。总结起来分为几点功能:
- 显示当天代办事项
- 待办事项增删改查
- 过期代办事项无法编辑
- 数据持久化存储
- 程序输出高亮显示
程序源码存放Github 代办事项小程序源码github地址
掌握技能
- json 增删改查
- 指针
- 结构体
- 函数
- 映射
- time模块
程序功能效果
新增功能
查看功能
删除功能
更改功能
退出功能
核心源码分析
数据格式字段
数据字段较少,主要将Items字段 进行列表嵌套map
{
"Items": [
{
"Content": "2021奥运会",
"Time": "2021/07/28"
},
....
]
}
在go 语言中定义了struct结构体,来对接json格式
type ItemsList struct {
Content string `json: "content"`
Time string `json: "time"`
}
type Todo struct {
Items []ItemsList `json: "items"`
}
读json数据的两种方式
新增代办功能,采用struct方式接收json数据
// 新增代办事项
func addTodo() {
var Item ItemsList
// 新增代办事项内容
fmt.Printf("新增代办事项内容: ")
fmt.Scanf("%s\n", &Item.Content)
// 请输入自定义时间, 校验时间格式
fmt.Println("时间格式 2021/07/07")
fmt.Printf("输入代办事项时间: ")
fmt.Scanf("%s\n", &Item.Time)
// 读取json文件
data, err := ioutil.ReadFile(JSONFILE)
checkErr(err)
newTodo := &Todo{}
err = json.Unmarshal(data, &newTodo)
checkErr(err)
// 创建slice, 汇总新增代办事项
item := []map[string]string{}
// struct 转 map 类型
for _, data := range newTodo.Items {
itemMap := make(map[string]interface{})
obj1 := reflect.TypeOf(data)
obj2 := reflect.ValueOf(data)
for i := 0; i < obj1.NumField(); i++ {
itemMap[obj1.Field(i).Name] = obj2.Field(i).Interface()
}
// 拼接成单条代办事项
subItemMap := map[string]string{}
for k, v := range itemMap {
// interface 类型转换 string类型
ov, _ := v.(string)
subItemMap[k] = ov
}
// 汇总本地json中代办事项
item = append(item, subItemMap)
}
// 新增代办事项, 合并
item = append(item, map[string]string{"Content": Item.Content, "Time": Item.Time})
// 写入json文件
writeJson(&item)
formatInput(">> 新增成功")
}
其他功能,采用map方式接收json数据
// 删除待办事项
func deleteTodo() {
var no int
fmt.Printf("输入删除代办事项的序号: ")
fmt.Scanf("%d\n", &no)
// 读取json文件
mapTodo := make(map[string]interface{})
readJson(&mapTodo)
// 追加代办列表
item := []map[string]string{}
for index, v := range mapTodo["Items"].([]interface{}) {
v := v.(map[string]interface{})
if no != index {
// 代办事项, 合并
item = append(item, map[string]string{"Content": v["Content"].(string), "Time": v["Time"].(string)})
}
}
// 写入json文件
writeJson(&item)
formatInput(">> 删除成功")
}
总结,使用这两种方式,更能理解go对各种数据格式之间的转换。
更多的小程序案例,持续更新.... 小伙伴们敬请期待