boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

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


avatar
作者 2025年9月2日 7

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

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

// 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, "加载任务失败: %vn", 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("✅ 已添加任务: %sn", 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: %dn", 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 接口。不复杂但容易忽略的是错误处理和文件初始化逻辑,确保健壮性很重要。



评论(已关闭)

评论已关闭