0

0

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

P粉602998670

P粉602998670

发布时间:2025-09-02 09:26:02

|

920人浏览过

|

来源于php中文网

原创

答案是通过构建一个文件存储的待办事项应用快速上手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) }

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

FashionLabs
FashionLabs

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如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

177

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

336

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

189

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

191

2025.06.17

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

3

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
golang socket 编程
golang socket 编程

共2课时 | 0.1万人学习

nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

golang和swoole核心底层分析
golang和swoole核心底层分析

共3课时 | 0.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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