首页 > 后端开发 > Golang > 正文

一步一步教你用Golang实现一个基于文件的待办事项(To-Do List)应用

P粉602998670
发布: 2025-09-02 09:26:02
原创
910人浏览过
答案是通过构建一个文件存储的待办事项应用快速上手Golang。该应用使用Go语言实现任务添加、标记完成、列表展示功能,数据保存为本地JSON文件,无需数据库,涵盖结构体定义、JSON编解码、文件读写与命令行解析等核心知识点,适合初学者掌握基础语法与实际项目结构。

一步一步教你用golang实现一个基于文件的待办事项(to-do list)应用

想快速上手 Golang?从一个简单实用的小项目开始是最佳选择。本文带你一步步用 Golang 实现一个基于文件的待办事项(To-Do List)应用。这个应用支持添加任务、标记完成、查看任务列表,并将数据保存在本地 JSON 文件中。不需要数据库,也不依赖外部框架,纯 Go 实现。

1. 项目结构设计

我们先规划项目的基本结构:

  • main.go:程序入口
  • todo.go:定义任务结构和操作逻辑
  • data/todos.json:存储任务数据的文件(自动创建)

在项目目录中创建这些文件和文件夹:

mkdir todo-app
cd todo-app
mkdir data
touch main.go todo.go
touch data/todos.json

2. 定义任务结构(todo.go)

打开 todo.go,我们先定义任务的结构体和一些基本方法。

立即学习go语言免费学习笔记(深入)”;

package main

import "time"

// Task 表示一个待办事项 type Task struct { ID int

json:"id"
登录后复制
Title string
json:"title"
登录后复制
Done bool
json:"done"
登录后复制
CreatedAt time.Time
json:"created_at"
登录后复制
}

接下来,定义一个结构体来管理任务列表:

// TaskList 管理所有任务 type TaskList struct { Tasks []Task

json:"tasks"
登录后复制
}

添加一个方法来保存任务到 JSON 文件:

import ( "encoding/json" "os" )

const dataFile = "data/todos.json"

// Save 将任务列表保存到文件 func (tl *TaskList) Save() error { data, err := json.MarshalIndent(tl, "", " ") if err != nil { return err } return os.WriteFile(dataFile, data, 0644) }

再添加一个方法从文件加载任务:

360 AI助手
360 AI助手

360公司推出的AI聊天机器人聚合平台,集合了国内15家顶尖的AI大模型。

360 AI助手 140
查看详情 360 AI助手

// LoadTaskList 从文件加载任务列表 func LoadTaskList() (*TaskList, error) { tl := &TaskList{} data, err := os.ReadFile(dataFile) if err != nil { // 如果文件不存在,返回空列表 if os.IsNotExist(err) { tl.Tasks = []Task{} return tl, nil } return nil, err } if len(data) == 0 { tl.Tasks = []Task{} return tl, nil } err = json.Unmarshal(data, tl) return tl, err }

3. 实现核心功能

todo.go 中添加添加任务和标记完成的方法。

// Add 添加新任务 func (tl *TaskList) Add(title string) { newID := 1 if len(tl.Tasks) > 0 { newID = tl.Tasks[len(tl.Tasks)-1].ID + 1 } task := Task{ ID: newID, Title: title, Done: false, CreatedAt: time.Now(), } tl.Tasks = append(tl.Tasks, task) }

// MarkDone 标记任务为完成 func (tl *TaskList) MarkDone(id int) error { for i := range tl.Tasks { if tl.Tasks[i].ID == id { tl.Tasks[i].Done = true return nil } } return fmt.Errorf("task with ID %d not found", id) }

// PrintList 打印所有任务 func (tl *TaskList) PrintList() { if len(tl.Tasks) == 0 { fmt.Println("暂无任务") return } for _, task := range tl.Tasks { status := "□" if task.Done { status = "✓" } fmt.Printf("[%s] %d. %s (创建于 %s)\n", status, task.ID, task.Title, task.CreatedAt.Format("2006-01-02")) } }

4. 编写主程序(main.go)

现在打开 main.go,实现命令行交互逻辑。

package main

import ( "fmt" "os" "strconv" "strings" )

main 函数中解析命令行参数:

func main() { args := os.Args[1:] if len(args) == 0 { showUsage() return }

// 加载任务列表
taskList, err := LoadTaskList()
if err != nil {
    fmt.Fprintf(os.Stderr, "加载任务失败: %v\n", err)
    os.Exit(1)
}

cmd := args[0]

switch cmd {
case "add":
    if len(args) < 2 {
        fmt.Println("请提供任务内容")
        return
    }
    title := strings.Join(args[1:], " ")
    taskList.Add(title)
    taskList.Save()
    fmt.Printf("✅ 已添加任务: %s\n", title)

case "done":
    if len(args) < 2 {
        fmt.Println("请提供任务ID")
        return
    }
    id, err := strconv.Atoi(args[1])
    if err != nil {
        fmt.Println("ID必须是数字")
        return
    }
    err = taskList.MarkDone(id)
    if err != nil {
        fmt.Println(err)
        return
    }
    taskList.Save()
    fmt.Printf("✅ 已完成任务 ID: %d\n", id)

case "list":
    taskList.PrintList()

default:
    showUsage()
}
登录后复制

}

添加一个帮助提示函数:

func showUsage() { fmt.Println("用法:") fmt.Println(" todo add <任务内容> - 添加新任务") fmt.Println(" todo done - 标记任务完成") fmt.Println(" todo list - 查看所有任务") }

5. 运行与测试

确保你已经初始化 Go 模块:

go mod init todo-app

现在可以运行应用了:

go run main.go add 学习Go语言基础
go run main.go add 完成待办事项项目
go run main.go list
go run main.go done 1
go run main.go list

每次操作后,data/todos.json 文件会自动更新,内容类似:

{ "tasks": [ { "id": 1, "title": "学习Go语言基础", "done": true, "created_at": "2025-04-05T10:00:00Z" }, { "id": 2, "title": "完成待办事项项目", "done": false, "created_at": "2025-04-05T10:01:00Z" } ] }

基本上就这些。这个小应用展示了 Go 的结构体、JSON 编解码、文件读写和命令行处理等核心特性。你可以继续扩展它,比如支持删除任务、按状态过滤、或添加 Web 接口。不复杂但容易忽略的是错误处理和文件初始化逻辑,确保健壮性很重要。

以上就是一步一步教你用Golang实现一个基于文件的待办事项(To-Do List)应用的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号