如何在Golang中开发Todo列表应用_使用切片和结构体管理任务

发布时间 - 2026-01-01 00:00:00    点击率:
Go中Todo应用用结构体定义任务、切片管理列表,支持增删查改;ID自增,Completed用bool;封装AddTodo、ToggleTodo等函数,命令行交互实现add/done/list功能。

在 Go 中开发一个简单的 Todo 列表应用,核心是用结构体定义任务数据,用切片([]Todo)动态管理多个任务。这种方式轻量、高效,无需外部依赖,适合学习和小型工具场景。

定义任务结构体

每个任务至少需要标识、内容、完成状态三个字段。结构体应导出首字母大写的字段,便于 JSON 序列化或后续扩展:

示例:

type Todo struct {
    ID        int    `json:"id"`
    Text      string `json:"text"`
    Completed bool   `json:"completed"`
}

注意:ID 可用自增整数模拟唯一性(生产环境建议用 UUID 或数据库主键);Completed 用布尔值清晰表达状态。

用切片存储和操作任务列表

声明一个全局或局部的 []Todo 切片作为数据容器,所有增删查改都围绕它进行:

  • 添加任务:用 append() 追加新实例,ID 可基于切片长度自动分配(如 len(todos) + 1
  • 查找任务:遍历切片,按 ID 匹配,返回指针可直接修改原数据
  • 更新任务:找到对应元素后直接赋值,如 todo.Completed = true
  • 删除任务:用切片截取技巧(如 todos = append(todos[:i], todos[i+1:]...))避免内存泄漏

封装基础操作函数提升可读性

把重复逻辑抽成函数,例如:

func AddTodo(todos *[]Todo, text string) {
    id := len(*todos) + 1
    *todos = append(*todos, Todo{ID: id, Text: text, Completed: false})
}

func ToggleTodo(todos []Todo, id int) bool {
    for i := range todos {
        if todos[i].ID == id {
            todos[i].Completed = !todos[i].Completed
            return true
        }
    }
    return false
}

注意传参方式:添加需修改切片底层数组,用指针;查询/切换只需读取或原地修改,传值即可(Go 中切片本身含指针,传值不影响性能)。

简单命令行交互演示流程

fmt.Scanlnswitch 模拟基础 CLI:

  • 输入 add 购买牛奶 → 调用 AddTodo
  • 输入 done 2 → 调用 ToggleTodo
  • 输入 list → 遍历打印,已完成任务加 [x] 前缀

无需框架,几十余行代码就能跑通完整流程,适合理解 Go 的数据建模与控制流本质。


# js  # json  # go  # golang  # app  # 工具  # switch  # 封装  # 结构体  # bool  # 指针  # 切片  # len  # append  # 数据库  # 遍历  # 命令行  # 就能  # 多个  # 只需  # 可直接  # 十余  # 完成任务  # 主键  # 首字母 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何选择PHP开源工具快速搭建网站?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel如何实现一对一模型关联?(Eloquent示例)  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  如何在云主机上快速搭建网站?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  如何实现建站之星域名转发设置?  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  JavaScript如何实现音频处理_Web Audio API如何工作?  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Laravel中的withCount方法怎么高效统计关联模型数量  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  昵图网官网入口 昵图网素材平台官方入口  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  长沙企业网站制作哪家好,长沙水业集团官方网站?  如何用wdcp快速搭建高效网站?  Laravel如何实现模型的全局作用域?(Global Scope示例)  jQuery 常见小例汇总  javascript如何操作浏览器历史记录_怎样实现无刷新导航  js实现获取鼠标当前的位置  移动端脚本框架Hammer.js  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  微信小程序 canvas开发实例及注意事项  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  装修招标网站设计制作流程,装修招标流程?  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  如何在阿里云虚拟服务器快速搭建网站?  Laravel如何实现用户注册和登录?(Auth脚手架指南)  网站制作报价单模板图片,小松挖机官方网站报价?  如何在局域网内绑定自建网站域名?  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  在线制作视频的网站有哪些,电脑如何制作视频短片?  WEB开发之注册页面验证码倒计时代码的实现  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  Linux后台任务运行方法_nohup与&使用技巧【技巧】  香港网站服务器数量如何影响SEO优化效果?  IOS倒计时设置UIButton标题title的抖动问题  微信小程序 闭包写法详细介绍  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  教你用AI将一段旋律扩展成一首完整的曲子  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Laravel怎么为数据库表字段添加索引以优化查询