Go写的第二个小程序《代办事项》,来啦

769 阅读2分钟

需求说明

代办事项小程序,是模仿手机上 "提醒事项功能" 用Go做的几个简单的增删改查操作,包括信息的持久化存储采用json格式存储、代办事项时间过期则不能被修改等特性。总结起来分为几点功能:

  1. 显示当天代办事项
  2. 待办事项增删改查
  3. 过期代办事项无法编辑
  4. 数据持久化存储
  5. 程序输出高亮显示

程序源码存放Github 代办事项小程序源码github地址

掌握技能

  • json 增删改查
  • 指针
  • 结构体
  • 函数
  • 映射
  • time模块

程序功能效果

新增功能

新增.png

查看功能

查看.png

删除功能

删除.png

更改功能

更改.png

退出功能

退出.png

核心源码分析

数据格式字段

数据字段较少,主要将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对各种数据格式之间的转换。

更多的小程序案例,持续更新.... 小伙伴们敬请期待