Go语言工程实践课后作业 | 豆包MarsCode AI刷题

97 阅读5分钟

Go语言工程实践课后作业

在现代软件开发中,工程化实践是开发团队高效协作、快速迭代的重要基础。Go语言(Golang)作为一门现代化的编程语言,以其简洁的语法、强大的性能、内置并发支持,成为了构建现代工程化项目的理想选择。在这次课后作业中,我们将以一个实际案例为基础,从实现思路、代码实现到路径记录,全面解析Go语言在工程实践中的应用。


作业任务描述

任务:开发一个简易的任务管理系统,实现以下功能:

  1. 添加任务:用户可以输入任务名称,并将其存储。
  2. 查看任务:显示当前所有任务。
  3. 删除任务:根据任务的编号删除对应任务。
  4. 持久化存储:任务数据能够保存到本地文件,支持程序重启后数据仍然可用。

1. 实现思路

1.1 需求分析

  • 核心功能:任务的增删查改。
  • 持久化:任务需要保存到文件中,保证数据的长期有效性。
  • 命令行交互:通过命令行交互用户输入和程序操作。
  • 清晰的模块划分
    • 数据处理模块:负责增删改查操作。
    • 持久化模块:负责读取和写入文件。
    • 用户交互模块:处理用户的输入输出。

1.2 工程化目录结构

为便于扩展和维护,遵循工程化的思路,我们将代码按照以下目录结构组织:

task-manager/
├── main.go          # 主程序入口
├── task/            # 任务管理模块
│   ├── task.go      # 任务相关的逻辑
│   └── storage.go   # 持久化相关逻辑
├── data/            # 数据存储目录
│   └── tasks.json   # 任务数据文件
└── README.md        # 项目说明

1.3 使用的技术点

  • 文件操作:使用Go语言标准库的osio/ioutil实现文件的读写。
  • JSON序列化和反序列化:使用encoding/json模块存储任务数据。
  • 结构体和方法:将任务设计为结构体,并为其定义一系列方法以便操作。
  • 模块化设计:每个功能模块独立,实现高内聚低耦合。

2. 代码实现

2.1 任务管理模块

创建一个task模块用于定义任务和任务列表的操作。

task/task.go

package task

import "fmt"

type Task struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

type TaskManager struct {
    Tasks []Task
    nextID int
}

// 创建一个新的任务管理器
func NewTaskManager() *TaskManager {
    return &TaskManager{Tasks: []Task{}, nextID: 1}
}

// 添加任务
func (tm *TaskManager) AddTask(name string) {
    task := Task{ID: tm.nextID, Name: name}
    tm.Tasks = append(tm.Tasks, task)
    tm.nextID++
    fmt.Printf("任务已添加:%s\n", name)
}

// 查看所有任务
func (tm *TaskManager) ListTasks() {
    if len(tm.Tasks) == 0 {
        fmt.Println("当前没有任务")
        return
    }
    fmt.Println("任务列表:")
    for _, task := range tm.Tasks {
        fmt.Printf("[%d] %s\n", task.ID, task.Name)
    }
}

// 删除任务
func (tm *TaskManager) DeleteTask(id int) {
    for i, task := range tm.Tasks {
        if task.ID == id {
            tm.Tasks = append(tm.Tasks[:i], tm.Tasks[i+1:]...)
            fmt.Printf("任务已删除:%s\n", task.Name)
            return
        }
    }
    fmt.Println("未找到该任务ID")
}

2.2 持久化模块

为了保证数据可持久化存储,我们将任务列表序列化为JSON并写入文件。

task/storage.go

package task

import (
    "encoding/json"
    "io/ioutil"
    "os"
)

const dataFile = "data/tasks.json"

// 从文件加载任务
func (tm *TaskManager) LoadTasks() error {
    file, err := os.Open(dataFile)
    if err != nil {
        if os.IsNotExist(err) {
            return nil // 文件不存在则直接返回
        }
        return err
    }
    defer file.Close()

    // 读取文件内容并反序列化
    data, err := ioutil.ReadAll(file)
    if err != nil {
        return err
    }
    return json.Unmarshal(data, &tm.Tasks)
}

// 将任务保存到文件
func (tm *TaskManager) SaveTasks() error {
    data, err := json.Marshal(tm.Tasks)
    if err != nil {
        return err
    }
    return ioutil.WriteFile(dataFile, data, 0644)
}

2.3 主程序入口

主程序负责用户的交互。

main.go

package main

import (
    "fmt"
    "task-manager/task"
)

func main() {
    tm := task.NewTaskManager()

    // 加载任务数据
    if err := tm.LoadTasks(); err != nil {
        fmt.Println("加载任务失败:", err)
    } else {
        fmt.Println("任务数据加载成功")
    }

    for {
        fmt.Println("\n1. 添加任务")
        fmt.Println("2. 查看任务")
        fmt.Println("3. 删除任务")
        fmt.Println("4. 退出程序")

        var choice int
        fmt.Print("选择操作:")
        fmt.Scanln(&choice)

        switch choice {
        case 1:
            var name string
            fmt.Print("输入任务名称:")
            fmt.Scanln(&name)
            tm.AddTask(name)
        case 2:
            tm.ListTasks()
        case 3:
            var id int
            fmt.Print("输入任务ID:")
            fmt.Scanln(&id)
            tm.DeleteTask(id)
        case 4:
            if err := tm.SaveTasks(); err != nil {
                fmt.Println("保存任务失败:", err)
            } else {
                fmt.Println("任务保存成功,程序退出")
            }
            return
        default:
            fmt.Println("无效操作,请重新选择")
        }
    }
}

3. 路径记录与项目运行

  1. 目录创建: 在项目根目录执行以下命令:

    mkdir task-manager && cd task-manager
    mkdir task data
    touch main.go task/task.go task/storage.go data/tasks.json
    
  2. 运行项目

    go run main.go
    
  3. 功能测试

    • 添加任务:输入任务名称后任务将存储。
    • 查看任务:展示当前的任务列表。
    • 删除任务:通过ID删除对应任务。
    • 持久化存储:任务存储到data/tasks.json文件。

4. 自己的思考与应用场景

4.1 思考

  • 模块化设计:在实际开发中,模块化能够极大提升代码的可读性和可维护性。本次作业中将任务管理与存储逻辑分离,实现了低耦合的模块设计。
  • 持久化与扩展性:通过JSON文件实现了简单的持久化存储,同时为未来切换到数据库存储(如SQLite或MySQL)提供了基础。
  • 工程化实践:目录结构清晰,符合Go语言的工程化规范,为团队协作开发奠定了基础。

4.2 应用场景

  1. 个人工具开发:本系统可以用来管理个人的工作任务或学习计划。
  2. 企业级任务管理:通过引入多用户支持和Web接口,可将该系统扩展为企业级任务管理工具。
  3. 教学示例:该系统是一个非常适合初学者的工程化示例,可以帮助学习Go语言的基础语法和项目结构设计。

5. 总结

本次作业通过一个简易的任务管理系统,从需求分析到代码实现,再到实际运行记录,全面展示了Go语言的工程实践能力。在实际应用中,Go语言以其高效、简洁的特性,能够快速实现从简单工具到复杂系统的开发需求。这次实践不仅巩固了对Go语言基础语法的理解,也为构建更复杂的项目积累了宝贵经验。