1 指令测试:测试结果被缓存
go test ./tests -v
执行上面指令,会缓存测试的结果
修改路由
router.HandleFunc("/aboutHappy", aboutHandler).Methods("GET").Name("about")
然后执行测试,理应会报错404,但是却没有,都通过了
添加参数指令
go test ./tests -v -count=1
使测试次数为1,则无缓存;为2则缓存一次。
2 VSCode测试
也会被缓存,也需要设置-count参数
最后将上面测试的修改纠正过来,需要运行以下命令还原修改:
git checkout .
3 重构开始
从底层代码先入手。底层代码就是被依赖的代码,辅助方法、公用方法。
先重构RouteName2URL和getRouteVariable
新建pkg/route/router.go文件
// Package route 路由相关
package route
import (
"net/http"
"github.com/gorilla/mux"
)
// Router 路由对象
var Router *mux.Router
// Initialize 初始化路由
func Initialize() {
Router = mux.NewRouter()
}
// Name2URL 通过路由来获取 URL
func Name2URL(routeName string, pairs ...string) string {
url, err := Router.Get(routeName).URL(pairs...)
if err != nil {
// checkError(err)
return ""
}
return url.String()
}
// GetRouteVariable 得到路由参数
func GetRouteVariable(parameterName string, r *http.Request) string {
vars := mux.Vars(r)
return vars[parameterName]
}
将main.go中文件对应修改
package main
import (
.
.
.
"goblog/pkg/route"
)
var router *mux.Router
var db *sql.DB
.
.
.
func articlesShowHandler(w http.ResponseWriter, r *http.Request) {
.
.
.
if err != nil {
.
.
.
} else {
// 4. 读取成功,显示文章
tmpl, err := template.New("show.gohtml").
Funcs(template.FuncMap{
"RouteName2URL": route.Name2URL,
"Int64ToString": Int64ToString,
}).
ParseFiles("resources/views/articles/show.gohtml")
.
.
.
}
}
.
.
.
func main() {
initDB()
createTables()
route.Initialize()
router = route.Router
.
.
.
}
ctrl + F
然后用route.GetRouteVariable替换getRouteVariable
4 日志与类型转换
抽离 checkError () 和 Int64ToString () 方法
4.1 记录错误日志功能
checkError() 更多是打印日志,记录日志的功能。
将其抽离到 pkg 里,为了跟标准库里的 log 做区分,我们取名为 logger:
pkg/logger/logger.go
// Package logger 日志相关
package logger
import "log"
// LogError 当存在错误时记录日志
func LogError(err error) {
if err != nil {
log.Fatal(err)
}
}
修改main.go
(1)import “goblog/pkg/logger” 引入包
(2)删除原来定义的checkError函数
(3)把所有用到的checkError替换成logger.LogError
批量替换两种方式:
1.ctrl + f 查找后批量替换
2. 双击选择需要整体修改的内容,然后选择所有匹配项,就能一改全改
4.2 类型转换功能
重构 Int64ToString() 方法,此方法是将 Int64 类型的数据转换为 string 类型。
pkg/types/converter.go
// Package types 提供了一些类型转换的方法
package types
import "strconv"
// Int64ToString 将 int64 转换为 string
func Int64ToString(num int64) string {
return strconv.FormatInt(num, 10)
}
修改main.go文件
(1)删除其定义的函数
(2)import “goblog/pkg/types” 引入包
(3)使用包中的函数types.Int64ToString
5 数据库初始化
重构数据库初始化相关的代码
pkg/database/database.go
// Package database 数据库相关
package database
import (
"database/sql"
"goblog/pkg/logger"
"time"
"github.com/go-sql-driver/mysql"
)
// DB 数据库对象
var DB *sql.DB
// Initialize 初始化数据库
func Initialize() {
initDB()
createTables()
}
func initDB() {
var err error
// 设置数据库连接信息
config := mysql.Config{
User: "root",
Passwd: "secret",
Addr: "127.0.0.1:3306",
Net: "tcp",
DBName: "goblog",
AllowNativePasswords: true,
}
// 准备数据库连接池
DB, err = sql.Open("mysql", config.FormatDSN())
logger.LogError(err)
// 设置最大连接数
DB.SetMaxOpenConns(100)
// 设置最大空闲连接数
DB.SetMaxIdleConns(25)
// 设置每个链接的过期时间
DB.SetConnMaxLifetime(5 * time.Minute)
// 尝试连接,失败会报错
err = DB.Ping()
logger.LogError(err)
}
func createTables() {
createArticlesSQL := `CREATE TABLE IF NOT EXISTS articles(
id bigint(20) PRIMARY KEY AUTO_INCREMENT NOT NULL,
title varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
body longtext COLLATE utf8mb4_unicode_ci
); `
_, err := DB.Exec(createArticlesSQL)
logger.LogError(err)
}
修改main.go文件
(1)不能自动,所以手动导入自建的包,import “goblog/pkg/database”
(2)删除掉 initDB() 和 createTables() 两个函数的定义及其调用。
(3)新增调用
.
.
.
func main() {
database.Initialize()
db = database.DB
route.Initialize()
router = route.Router
.
.
.
}