使用Go语言开发任务待办清单Web应用

 更新时间:2025年09月16日 08:19:15   作者:程序员爱钓鱼  
在学习 Go 的过程中,一个非常适合入门的 Web 项目就是 TodoList(任务待办清单),本文将为大家详细介绍一下具体实现方法,希望对大家有所帮助

在学习 Go 的过程中,一个非常适合入门的 Web 项目就是 TodoList(任务待办清单)。它功能简单,但涵盖了 HTTP 路由、数据存储、前后端交互 等核心知识点。本篇我们将实现一个基于 Go 标准库 + HTML 模板 的 TodoList 应用。

一、项目目标

实现一个简易的 任务待办清单 Web 应用

  • 查看任务列表
  • 添加任务
  • 删除任务
  • 标记任务完成/未完成
  • 数据持久化(存储在 JSON 文件)

二、系统设计

数据结构

type Task struct {
    ID        int    `json:"id"`
    Title     string `json:"title"`
    Completed bool   `json:"completed"`
}

路由设计

路径方法功能
/GET展示任务列表
/addPOST添加任务
/delete?id=GET删除任务
/toggle?id=GET切换完成状态

存储方式

  • 使用 JSON 文件存储所有任务 (tasks.json)
  • 每次操作时更新文件,保证数据持久化

三、完整代码示例

文件名:main.go

package main

import (
	"encoding/json"
	"html/template"
	"net/http"
	"os"
	"strconv"
	"sync"
)

type Task struct {
	ID        int    `json:"id"`
	Title     string `json:"title"`
	Completed bool   `json:"completed"`
}

var (
	tasks    []Task
	dataFile = "tasks.json"
	mutex    sync.Mutex
)

// 加载任务
func loadTasks() {
	file, err := os.ReadFile(dataFile)
	if err != nil {
		tasks = []Task{}
		return
	}
	_ = json.Unmarshal(file, &tasks)
}

// 保存任务
func saveTasks() {
	data, _ := json.MarshalIndent(tasks, "", "  ")
	_ = os.WriteFile(dataFile, data, 0644)
}

// 首页:显示任务列表
func indexHandler(w http.ResponseWriter, r *http.Request) {
	tmpl := `
	<!DOCTYPE html>
	<html>
	<head>
		<meta charset="UTF-8">
		<title>Todo List</title>
		<style>
			body { font-family: Arial, sans-serif; margin: 20px; }
			.done { text-decoration: line-through; color: gray; }
		</style>
	</head>
	<body>
		<h1>任务待办清单 ✅</h1>
		<form method="POST" action="/add">
			<input type="text" name="title" placeholder="输入任务..." required>
			<button type="submit">添加</button>
		</form>
		<ul>
			{{range .}}
				<li>
					<a href="/toggle?id={{.ID}}" rel="external nofollow" >
						<span class="{{if .Completed}}done{{end}}">{{.Title}}</span>
					</a>
					<a href="/delete?id={{.ID}}" rel="external nofollow"  style="color:red;">[删除]</a>
				</li>
			{{end}}
		</ul>
	</body>
	</html>`
	t := template.Must(template.New("index").Parse(tmpl))
	_ = t.Execute(w, tasks)
}

// 添加任务
func addHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method == http.MethodPost {
		title := r.FormValue("title")
		if title != "" {
			mutex.Lock()
			id := 1
			if len(tasks) > 0 {
				id = tasks[len(tasks)-1].ID + 1
			}
			tasks = append(tasks, Task{ID: id, Title: title, Completed: false})
			saveTasks()
			mutex.Unlock()
		}
	}
	http.Redirect(w, r, "/", http.StatusFound)
}

// 删除任务
func deleteHandler(w http.ResponseWriter, r *http.Request) {
	idStr := r.URL.Query().Get("id")
	if id, err := strconv.Atoi(idStr); err == nil {
		mutex.Lock()
		for i, t := range tasks {
			if t.ID == id {
				tasks = append(tasks[:i], tasks[i+1:]...)
				break
			}
		}
		saveTasks()
		mutex.Unlock()
	}
	http.Redirect(w, r, "/", http.StatusFound)
}

// 切换任务完成状态
func toggleHandler(w http.ResponseWriter, r *http.Request) {
	idStr := r.URL.Query().Get("id")
	if id, err := strconv.Atoi(idStr); err == nil {
		mutex.Lock()
		for i, t := range tasks {
			if t.ID == id {
				tasks[i].Completed = !tasks[i].Completed
				break
			}
		}
		saveTasks()
		mutex.Unlock()
	}
	http.Redirect(w, r, "/", http.StatusFound)
}

func main() {
	loadTasks()

	http.HandleFunc("/", indexHandler)
	http.HandleFunc("/add", addHandler)
	http.HandleFunc("/delete", deleteHandler)
	http.HandleFunc("/toggle", toggleHandler)

	println("服务器启动:http://localhost:8080")
	_ = http.ListenAndServe(":8080", nil)
}

四、运行效果

启动服务

go run main.go

浏览器访问 http://localhost:8080

  • 输入任务 → 点击“添加” → 列表中出现
  • 点击任务文字 → 切换完成状态(加删除线 ✅)
  • 点击 [删除] → 删除任务

数据保存在 tasks.json 文件,重启服务数据仍然存在。

五、扩展方向

  • 任务编辑功能:修改任务标题
  • 增加截止日期 / 优先级
  • 搜索 & 分类:已完成 / 未完成分组
  • 使用前端框架:Vue/React + Go 后端 API
  • 替换存储:SQLite/MySQL/Postgres

六、总结

这个 TodoList Web 应用示例,涵盖了:

  • Go 标准库 net/http 的基本用法
  • HTML 模板 渲染动态页面
  • JSON 文件持久化
  • 简单的 并发控制(sync.Mutex)

是非常好的 Go Web 开发入门实战案例。

到此这篇关于使用Go语言开发任务待办清单Web应用的文章就介绍到这了,更多相关Go任务待办清单应用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言sort包函数使用示例

    Go语言sort包函数使用示例

    这篇文章主要为大家介绍了Go语言sort包函数使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Golang error使用场景介绍

    Golang error使用场景介绍

    我们在使用Golang时,不可避免会遇到异常情况的处理,与Java、Python等语言不同的是,Go中并没有try...catch...这样的语句块,这个时候我们如何才能更好的处理异常呢?本文来教你正确方法
    2023-03-03
  • go语言中的面向对象

    go语言中的面向对象

    Go不支持类,而是提供了结构体。结构体中可以添加属性和方法。这样可以将数据和操作数据的方法绑定在一起,实现与类相似的效果。这篇文章介绍了go语言中的面向对象,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Go语言中JWT的创建和解析操作详解

    Go语言中JWT的创建和解析操作详解

    JWT的全名是Json web token,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准,这篇文章主要介绍了在Go语言中JWT的创建和解析操作,感兴趣的同学可以参考下文
    2023-05-05
  • 浅谈Golang中创建一个简单的服务器的方法

    浅谈Golang中创建一个简单的服务器的方法

    这篇文章主要介绍了浅谈Golang中创建一个简单的服务器的方法,golang中的net/http包对网络的支持非常好,这样会让我们比较容易的建立起一个相对简单的服务器,有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Go reflect 反射原理示例详解

    Go reflect 反射原理示例详解

    这篇文章主要为大家介绍了Go reflect 反射原理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 解决Go gorm踩过的坑

    解决Go gorm踩过的坑

    这篇文章主要介绍了解决Go gorm踩过的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • golang使用sync.singleflight解决热点缓存穿透问题

    golang使用sync.singleflight解决热点缓存穿透问题

    在go的sync包中,有一个singleflight包,里面有一个 singleflight.go文件,代码加注释,一共200行出头,通过 singleflight可以很容易实现缓存和去重的效果,避免重复计算,接下来我们就给大家详细介绍一下sync.singleflight如何解决热点缓存穿透问题
    2023-07-07
  • 一文掌握gorm简介及如何使用gorm

    一文掌握gorm简介及如何使用gorm

    Gorm是一款用于Golang的ORM框架,它提供了丰富的功能,包括模型定义、数据验证、关联查询等,下面通过本文掌握gorm简介及使用方法,需要的朋友可以参考下
    2024-02-02
  • Go并发编程结构体多字段原子操作示例详解

    Go并发编程结构体多字段原子操作示例详解

    这篇文章主要为大家介绍了Go并发编程结构体多字段原子操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论