【go项目01_学习记录13】

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
    .
    .
    .
}

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值