这是我参与「第五届青训营」伴学笔记创作活动的第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!。
成长
项目需求:
- 展示话题
- 展示回帖列表
- 实现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所带来的损失通常无法估量。因此,在实际上线之前,需要对程序进行测试。
通常来说,有多种测试方法。比如说回归测试、集成测试、单元测试等等。而单元测试是成本最低、覆盖率最高的测试方法,它通常针对每一个模块甚至是每一个函数进行测试。通过运行多个单元测试,可以大概知道程序的整体质量。
完善
项目需求:
- 在上面的基础上增加发帖功能
为了进一步完善和明确项目,我们将项目进一步拆分。拆分后的目录如下。
project
|------config // 配置设置
|------dao // 数据操作
|------handler // 业务处理
|------models // 模型文件
|------router // 路由
|------server // 服务初始化
|------test // 测试
|------utils // 工具类
|------main.go // 入口函数
随着项目进一步的拆分,我们的项目越来越易于阅读和维护。
总结
通过本节课的实践,我对项目实践的理解进一步加深了。同时也学到了更多的关于Go的工程进阶的知识。