热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Gin从零开始搭建gin项目框架

欢迎大家访问我的博客http:blog.ayla1688.cool原文连接http:blog.ayla1688.coolarchives413.html一、创建项目新建文件夹

欢迎大家访问我的博客http://blog.ayla1688.cool

原文连接http://blog.ayla1688.cool/archives/413.html


一、创建项目

新建文件夹 test

进入文件夹,在终端执行

go mod init

** go mod init ** 是使用go module 的管理包,前提是设置做了以下设置

GO111MODULE = on
GOPROXY=https://goproxy.cn,direct

执行 ** go mod init ** 后, 将在 ** test** 文件夹下生成 ** go.mod** 文件, 将会包含以下信息:模块名和go 版本

module awesomeProject/testgo 1.16

test 文件夹下创建相应的文件夹

2021-03-25T03:22:43.png

- test
|- - api //接口控制器包
|- - - controller.go //控制器文件
|- - common //公共函数包
| - - - functions.go //公共函数文件
|- - config //配置文件包
| - - - config.go //配置加载文件
| - - - config.yml //配置文件
|- - model //模型文件包
| - - - database.go //数据库连接初始化文件
| - - - pw_member.go //表模型文件
|- - resource // 静态文件夹
|- - route //路由文件包
| - - - router.go //路由配置文件
main.go // 入口文件 (图片显示 go-main.go 是我自己定义的文件,改成main.go即可)
go.mod // go 依赖管理文件


二、下载相关的包


  • gin下载

go get -u github.com/gin-gonic/gin

** gin ** 就是我们要使用的web 框架, 当然是要下载


  • viper 下载

go get github.com/spf13/viper

** viper** 是很好用配置控制包, 最关键的是可以监听配置参数改动,配置项发生改变无需重启服务


  • mysql 驱动下载

go get -u github.com/go-sql-driver/mysql

  • gorm 下载

go get -u gorm.io/gorm

上述安装完成后,可以在go.mod文件中看到我们依赖的所有包

2021-03-25T03:13:36.png


三、代码编写

逻辑代码编写部分,我们从 go-main.go 文件开始讲解

go-main.go

package mainimport ("awesomeProject/test/config""awesomeProject/test/model""awesomeProject/test/route""github.com/gin-gonic/gin""github.com/spf13/viper"
)func main() {r := route.InitRouter()//加载配置文件config.InitConfig()// 创建数据库连接model.InitDb()// defer关键字,当API访问结束时,关闭数据库连接defer model.Db.Close()//监听8000端口gin.SetMode(viper.GetString("server.run_mode"))r.Run(viper.GetString("server.addr"))
}

作为服务的入口文件,go-main.go 会开启web服务, 下面按照** go-main.go** 文件的代码顺序依次讲解作用

r := route.InitRouter()
// 定义了路由,route包中的InitRouter函数完成了路由配置,即url与控制器的对应


此处穿插介绍一下 golang引用包的顺序
2021-03-25T03:19:27.png

完毕!



r := route.InitRouter()
route包下 router.go 文件 InitRouter 函数

package route// 路由包import ("awesomeProject/test/api""github.com/gin-gonic/gin"
)func InitRouter() *gin.Engine {router := gin.Default()// 首页路由router.GET("/", api.GetIndex)// post测试路由router.POST("/test",api.PostTest)// 测试数据库操作router.GET("/testsql", api.GetTestSql)return router
}// 如果有新的接口,需要再函数内添加url 与 控制器的对应关系

config.InitConfig()
config 包下config.go文件 InitConfig函数

package configimport "github.com/spf13/viper"func InitConfig() {viper.AddConfigPath("./config")viper.SetConfigName("config")viper.SetConfigType("yaml")if err := viper.ReadInConfig();err != nil {if _, ok := err.(viper.ConfigFileNotFoundError); ok {panic("未找到配置文件")} else {panic("加载配置文件失败")}}// 监听配置文件变化viper.WatchConfig()
}// 配置viper包

model.InitDb()
model包下database文件 InitDb函数

package modelimport ("fmt""github.com/spf13/viper"_ "github.com/go-sql-driver/mysql""github.com/jinzhu/gorm"
)// 公共Db对象
var Db *gorm.DBfunc InitDb() {driverName := viper.GetString("db.driver_name")host := viper.GetString("db.host")port := viper.GetString("db.port")database := viper.GetString("db.database")username := viper.GetString("db.username")password := viper.GetString("db.password")charset := viper.GetString("db.charset")args := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true",username,password,host,port,database,charset,)db, err := gorm.Open(driverName, args)if err != nil {panic("failed to connect database,err:" + err.Error())}Db = db
}
// 从viper中取出数据库配置,连接数据库. 文件中定义了Db , 根据golang包引用规则,Db可以在其他地方调用。所以可以在模型文件中使用model.Db对象 进行数据库操作

defer model.Db.Close()defer 关键字,在main函数最后执行,当一次访问结束后,关闭数据库连接。


三、根据接口访问,依次介绍不同的文件

在上述router.go 中,我们定义好了url与控制器的对应关系。
controller.go

package api// 控制器包import ("awesomeProject/test/common""fmt""github.com/gin-gonic/gin""github.com/spf13/viper"
)// 首页控制器
func GetIndex(c *gin.Context) {// 传入code参数code := c.DefaultQuery("code", "0")var backdata map[string]interface{}if code == "0" {common.CommonFail(c, backdata, "code值缺少")} else {backdata, status :=common.GetAuth2Session(code)if status == 0 {common.CommonFail(c, backdata, "code 验证失败")} else {common.CommonSuccess(c, backdata)}}
}// 测试控制器
func PostTest(c * gin.Context) {//data := make(map[string]interface{})////data["foo"] = "bar"//fmt.Println(data)//c.JSON(200, data)//common.CommonFail(c, rest, "失败了")
}// 测试数据库操作
func GetTestSql(c *gin.Context) {//model.AddMember()//fmt.Println("执行完成")fmt.Println(viper.GetString("wx.appid"))}

当我们访问 http://localhost:8080/testsql 时,根据路由的映射,我们访问到了GetTestSql方法。我们在model/pw_member.go模型文件中添加一条用户信息

pw_member.go

package modelimport "fmt"type Pw_member struct {Id intName stringAge intSex int
}// 设置表名
func (Pw_member) TableName() string {return "pw_member"
}// 添加一行数据
func AddMember() {member := Pw_member{Name: "zhangsan", Age: 18, Sex: 1}result := Db.Create(&member)fmt.Println(member.Id)fmt.Println(result.RowsAffected)fmt.Println(result.Error)}

四、viper包配置项介绍

在整个项目的截图中,还有一个文件 config/config.yml 未介绍,由于跟viper 有关系,我们单独来介绍一下

配置文件加载我们知道是在 config/config.go 中完成,那配置项在哪设置呢? 答案就是在config.yml
config.yml


server:run_mode: debugaddr: :8000
wx:appid: 112212secret: 222222
db:driver_name: mysqlhost: 127.0.0.1port: 3306database: testusername: rootpassword: rootcharset: utf8

viper相关的使用教程,就请大家自行百度吧。


推荐阅读
author-avatar
手机用户2602916917
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有