工程进阶 | 青训营笔记

50 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第2天

前言

本节课的实践任务是使用高性能的go web框架Gin开发一个有路由的简易论坛后端。本文结合这个项目来谈。

项目实战

开始

项目需求:写一个web项目,能够返回hello world。

针对这个项目需求,我们只需要一个单文件就可以完成,甚至不需要引用任何第三方库。

//main.go
package main

import "net/http"

func sayHello(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello world!")
}

func main() {
    http.HandleFunc("/", sayHello)
    err := http.ListenAndServe(":8000", nil)
    if err != nil {
        fmt.Printf("http server failed, err:%v\n", err)
        return
    }
}

运行这个项目后,在浏览器中输入http://localhost:8000/ 后就可以看到Hello World!。

成长

项目需求:

  1. 展示话题
  2. 展示回帖列表
  3. 实现web服务

随着需求的增加,为了项目的管理便利,同时提高代码的可读性,我们将main.go文件拆分成router.go,handler.go和main.go三个文件,负责不同的任务。

project
|
|-- main.go    // 程序入口文件
|
|-- router.go  // 路由文件
|
|-- handler.go // 处理业务逻辑

在实际业务中,为了简化开发,我们通常会使用各种第三方框架。这就涉及到了包的管理。当然,如果使用Goland进行开发,那么简化这一步。Goland会自动帮你进行包管理(主要是go mod)。如果你是使用其他编辑器进行开发,那么你就需要手动进行包管理(可能有插件方便管理)。

包管理

包的安装 -- go get

一般来说,使用go get 命令安装第三方库。

基本语法为go get example.com/pkg@?

其中:example.com/pkg 是所需的依赖的仓库地址,?可以取这几个值update(缺省值,使用最新版本)、none(删除依赖)、{version}(具体的版本号)、{commit}(安装具体的分支)

值得注意的是,在1.17版本之前,go get命令还可以安装二进制可执行文件,但在1.17之后,此功能被go install 取代。

包的管理 -- go mod

go mod 是一个用于初始化、管理项目依赖的第三方指令,在项目目录中执行可以配置项目依赖。

  • go mod init 初始化项目
  • go mod download 下载模块到缓存
  • go mod tidy 维护依赖

测试

对于一个在部署在实际生产环境中的项目来说,一个Bug所带来的损失通常无法估量。因此,在实际上线之前,需要对程序进行测试。

通常来说,有多种测试方法。比如说回归测试、集成测试、单元测试等等。而单元测试是成本最低、覆盖率最高的测试方法,它通常针对每一个模块甚至是每一个函数进行测试。通过运行多个单元测试,可以大概知道程序的整体质量。

完善

项目需求:

  1. 在上面的基础上增加发帖功能

为了进一步完善和明确项目,我们将项目进一步拆分。拆分后的目录如下。

project
|------config   // 配置设置
|------dao      // 数据操作
|------handler  // 业务处理
|------models   // 模型文件
|------router   // 路由
|------server   // 服务初始化
|------test     // 测试
|------utils    // 工具类
|------main.go  // 入口函数

随着项目进一步的拆分,我们的项目越来越易于阅读和维护。

总结

通过本节课的实践,我对项目实践的理解进一步加深了。同时也学到了更多的关于Go的工程进阶的知识。