当前位置: 首页 > news >正文

郑州男科哪家比较正规医院凌哥seo技术博客

郑州男科哪家比较正规医院,凌哥seo技术博客,深圳高端设计网站,企业网站策划书模板范文目录 1. 介绍 2. 环境 3. gin 3.1 gin提供的常见路由 3.2 gin的分组 main.go router.go 代码结构 3.3 gin 提供的Json方法 main.go route.go common.go user.go order.go 3.4 gin框架下如何获取传递来的参数 第一种是GET请求后面直接 /拼上传递的参数 第二种是…

目录

1. 介绍

2. 环境

3. gin

3.1 gin提供的常见路由

3.2 gin的分组

main.go

router.go

代码结构

3.3 gin 提供的Json方法

main.go

route.go

common.go

user.go

order.go

3.4 gin框架下如何获取传递来的参数

第一种是GET请求后面直接 /拼上传递的参数

第二种是这样传递

第三种是以Json方式来传递

3.5 golang如何进行异常捕获和处理

4. 关于日志

5. gin如何操作数据库(需要用到gorm)

main.go

config

db.go

controller

common.go

order.go

user.go

dao

dao.go

models

user.go

router

router.go


1. 介绍

2. 环境

查看是否设置成功

(PS:go env -w GOSUMDB=sum.golang.org(GOSUM问题))

3. gin

gin 的路由是通过前缀树来实现的,每个请求方法一个前缀树(没有使用反射来实现,比反射的效率好得多),一般路由分为(GET,POST,DELETE等等,我们都来看看)

3.1 gin提供的常见路由

package mainimport ("net/http""github.com/gin-gonic/gin")func main() {//先生成一个实例r:= gin.Default()//再定义一个路由//第一个是访问的url 第二个是处理函数r.GET("/hello", func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, "Hello, World!")})r.POST("/user/list", func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, "user list")})r.PUT("/user/add", func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, "user add")})r.DELETE("/user/delete", func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, "user delete")})//可以使用ANY方法来处理所有的请求r.Any("/any", func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, "Hello, World!")})//最后启动web服务//可以指定端口号r.Run(":9999")
}

3.2 gin的分组

并且 gin 的路由是可以分组的(/user/list /user/add这种)

package mainimport ("net/http""github.com/gin-gonic/gin")func main() {//先生成一个实例r:= gin.Default()//再定义一个路由//第一个是访问的url 第二个是处理函数// r.GET("/hello", func(ctx *gin.Context) {// 	ctx.String(http.StatusOK/*200*/, "Hello, World!")// })// r.POST("/user/list", func(ctx *gin.Context) {// 	ctx.String(http.StatusOK/*200*/, "user list")// })// r.PUT("/user/add", func(ctx *gin.Context) {// 	ctx.String(http.StatusOK/*200*/, "user add")// })// r.DELETE("/user/delete", func(ctx *gin.Context) {// 	ctx.String(http.StatusOK/*200*/, "user delete")// })user:=r.Group("user"){//因为上面已经有/user了 所以这里不用再写/useruser.POST("/list", func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, "user list")})user.PUT("/add", func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, "user add")})user.DELETE("/delete", func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, "user delete")})}//最后启动web服务//可以指定端口号r.Run(":9999")
}

然后此时是写在main包里面的,而main包作为入口文件,把这么多的路由写在这里显然很不合理,所以我们创建一个router包去专门导入路由

main.go

package mainimport (//引入包这个整了很久,一直有各种问题//使用注意:要在 GOROOT/src 同级目录下创建项目,然后进入项目文件夹,//然后 go mod init 该文件夹,然后去使用 "gin-ranking/router"
)func main() {r:=router.Router()r.Run(":9999")
}

router.go

package router//和文件夹名保持一致import ("github.com/gin-gonic/gin""net/http"
)func Router() *gin.Engine {r := gin.Default()user:=r.Group("user"){//因为上面已经有/user了 所以这里不用再写/useruser.POST("/list", func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, "user list")})user.PUT("/add", func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, "user add")})user.DELETE("/delete", func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, "user delete")})}return r
}

代码结构

3.3 gin 提供的Json方法

gin返回Json数据很简单,因为他提供了Json方法

路由以及统一的返回

main.go

package mainimport ("gin-ranking/router"
)func main() {r:=router.Router()r.Run(":9999")
}

route.go

package router//和文件夹名保持一致import ("github.com/gin-gonic/gin""net/http""gin-ranking/controller"
)func Router() *gin.Engine {r := gin.Default()user:=r.Group("user"){//因为上面已经有/user了 所以这里不用再写/user 注意使用Talend的时候,前面是 ip:port/user/各种信息user.GET("/info",controller.UserController{}.GetUserInfo)user.POST("/list", controller.UserController{}.GetList)user.PUT("/add", func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, "user add")})user.DELETE("/delete", func(ctx *gin.Context) {ctx.String(http.StatusOK/*200*/, "user delete")})}order:=r.Group("/order"){order.POST("/list", controller.OrderController{}.GetList)}return r
}

common.go

package controllerimport ("github.com/gin-gonic/gin"
)type JsonStruct struct {Code int         `json:"code"`   //返回的是 200 400 404 500...Msg  interface{} `json:"msg"`    //返回的信息Data interface{} `json:"data"`   //返回的数据Count int64      `json:"count"`  //返回的数据总数
}type JsonErrorStruct struct {Code int         `json:"code"`   //返回的是 200 400 404 500...Msg  interface{} `json:"msg"`    //返回的信息
}func ReturnSucces(c *gin.Context, code int,msg interface{}, data interface{}, count int64) {json := &JsonStruct{Code: code,Msg:  msg,Data: data,Count: count,}c.JSON(200, json)
}func ReturnError(c *gin.Context, code int, msg interface{}) {json := &JsonErrorStruct{Code: code,Msg:  msg,}c.JSON(200, json)
}

user.go

package controllerimport ("github.com/gin-gonic/gin"
)//因为我们目前这么写的话,这些文件都在一个包也就其实是
//一个作用域,所以函数名容易重复,此时我们可以给他们加上一个前缀
//比如这里的UserController
type UserController struct {}func (u UserController)GetUserInfo(c *gin.Context) {ReturnSucces(c,0,"succes","user info",1)
}func (u UserController)GetList(c *gin.Context) {ReturnError(c,4004,"没有相关信息list")
}

order.go

package controllerimport ("github.com/gin-gonic/gin"
)type OrderController struct {}func (o OrderController)GetList(c *gin.Context){ReturnError(c,4004,"没有相关信息order")
}

3.4 gin框架下如何获取传递来的参数

传递参数一般分为三种:

第一种是GET请求后面直接 /拼上传递的参数

第二种是这样传递

第三种是以Json方式来传递

然后我们分别来看如何获取:

一 url方式:

这种我们一般会在路由中直接拼上

第二种是通过POST怎么接收值呢

这种方式路由是不用改的,直接改order.go

第三种是Json格式的数据传入

接收Json数据我们需要通过map或者结构体

对于Json还有一种解决方式就是用结构体

3.5 golang如何进行异常捕获和处理

其他语言底层抛出异常上层逻辑通过try catch捕获异常,但是go语言的设计者认为将异常与控制结构混在一起会很容易使得代码变得混乱,为了不影响代码的原有逻辑,采用的延迟执行捕获异常的模式来实现

defer:压栈延迟执行

recover:是个内建函数,可以让系统崩溃的流程恢复过来,仅在延迟函数defer内有效,在正常程序执行中调用会返回nil,并且没有任何效果。假如有问题调用recover可以捕获到panic的输入值,并且恢复正常的执行。

panic:让程序直接崩溃

我们改一下user.go

然后加上

web访问结果就是200,并且没有内容了

并且打印里面捕获到了异常

自定义log中间件,并实现日志的收集

4. 关于日志

///

关于日志,比较重要的有三种:

第一种是项目的请求日志和ngix类似,每次请求都保留日志

第二种是错误日志,当程序出现错误的时候,日志应该保留下来

第三种是在开发业务逻辑的时候,程序员自己保存的日志。比如请求第三方接口的时候,把接口返回的信息直接保留下来。

///

5. gin如何操作数据库(需要用到gorm)

gorm中文文档:GORM - The fantastic ORM library for Golang, aims to be developer friendly.

项目结构

main.go

package mainimport ("gin-ranking/router"
)func main() {r:=router.Router()r.Run(":9999")
}

config

db.go

package configconst (//Mysqldb = "root:123456@tcp(10.18.11.64:3306)/lml_dtbase?charset=utf8"
)

controller

common.go

package controllerimport ("github.com/gin-gonic/gin"
)type JsonStruct struct {Code int         `json:"code"`   //返回的是 200 400 404 500...Msg  interface{} `json:"msg"`    //返回的信息Data interface{} `json:"data"`   //返回的数据Count int64      `json:"count"`  //返回的数据总数
}type JsonErrorStruct struct {Code int         `json:"code"`   //返回的是 200 400 404 500...Msg  interface{} `json:"msg"`    //返回的信息
}func ReturnSucces(c *gin.Context, code int,msg interface{}, data interface{}, count int64) {json := &JsonStruct{Code: code,Msg:  msg,Data: data,Count: count,}c.JSON(200, json)
}func ReturnError(c *gin.Context, code int, msg interface{}) {json := &JsonErrorStruct{Code: code,Msg:  msg,}c.JSON(200, json)
}

order.go

package controllerimport ("github.com/gin-gonic/gin"
)type OrderController struct{}type Search struct {//需要注意的是定义结构体和返回的时候,//都要指定Json的字段,否则首字母大写肯定是匹配不上的//注意前端传来的数据一定是小写的所以我们统一转成小写Name string `json:"name"`Cid  int    `json:"cid"`
}func (o OrderController) GetList(c *gin.Context) {//cid:=c.PostForm("cid")//name:=c.DefaultPostForm("name","wangwu(Default)")// param := make(map[string]interface{})// err := c.BindJSON(&param)search := &Search{}err := c.BindJSON(&search)if err == nil {ReturnSucces(c, 0, search.Name, search.Cid, 1)return}ReturnError(c, 4001, gin.H{"err": err})
}

user.go

package controllerimport ("fmt""gin-ranking/models""strconv"//"gin-ranking/pkg/logger""github.com/gin-gonic/gin"
)// 因为我们目前这么写的话,这些文件都在一个包也就其实是
// 一个作用域,所以函数名容易重复,此时我们可以给他们加上一个前缀
// 比如这里的UserController
type UserController struct{}func (u UserController) GetUserInfo(c *gin.Context) {idStr := c.Param("id")name := c.Param("name")id, _ := strconv.Atoi(idStr)      //----------testuser, _ := models.GetUserTest(id) //-----testReturnSucces(c, 0, name, user, 1)
}func (u UserController) AddUser(c *gin.Context) {username := c.DefaultPostForm("username", "")id, err := models.AddUser(username)if err != nil {ReturnError(c, 4002, "保存错误")return}ReturnSucces(c, 0, "保存成功", id, 1)
}func (u UserController) UpdateUser(c *gin.Context) {username := c.DefaultPostForm("username", "") //获取usernameidStr := c.DefaultPostForm("id", "")id, _ := strconv.Atoi(idStr)models.UpdateUser(id, username)ReturnSucces(c, 0, "更新成功", true, 1)
}func (u UserController) DeleteUser(c *gin.Context) {idStr := c.DefaultPostForm("id", "")id, _ := strconv.Atoi(idStr)err := models.DeleteUser(id)if err != nil {ReturnError(c, 4002, "删除错误")return}ReturnSucces(c, 0, "删除成功", true, 1)
}func (u UserController) GetList(c *gin.Context) {//user loggerdefer func() {if err := recover(); err != nil {fmt.Println("异常捕获", err)}}()num1 := 1num2 := 0num3 := num1 / num2ReturnError(c, 4004, num3)//ReturnError(c, 4004, "没有相关信息list")
}func (u UserController) GetUserListTest(c *gin.Context) {users, err := models.GetUserListTest()if err != nil {ReturnError(c, 4004, "没有相关信息list")return}ReturnSucces(c, 0, "获取成功", users, 1)
}

dao

dao.go

package daoimport ("fmt""gin-ranking/config""time""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql"
)// 因为要和数据库建立连接,所以我们要把链接保存到var中
var (Db  *gorm.DBerr error
)func init() {Db, err = gorm.Open("mysql", config.Mysqldb)if err != nil {fmt.Println("-----mysql connect error:", err)}if Db.Error != nil {fmt.Println("-----database err:", err)}Db.DB().SetMaxIdleConns(10)Db.DB().SetMaxOpenConns(100)Db.DB().SetConnMaxLifetime(time.Hour)
}

models

user.go

package daoimport ("fmt""gin-ranking/config""time""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql"
)// 因为要和数据库建立连接,所以我们要把链接保存到var中
var (Db  *gorm.DBerr error
)func init() {Db, err = gorm.Open("mysql", config.Mysqldb)if err != nil {fmt.Println("-----mysql connect error:", err)}if Db.Error != nil {fmt.Println("-----database err:", err)}Db.DB().SetMaxIdleConns(10)Db.DB().SetMaxOpenConns(100)Db.DB().SetConnMaxLifetime(time.Hour)
}

router

router.go

package daoimport ("fmt""gin-ranking/config""time""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql"
)// 因为要和数据库建立连接,所以我们要把链接保存到var中
var (Db  *gorm.DBerr error
)func init() {Db, err = gorm.Open("mysql", config.Mysqldb)if err != nil {fmt.Println("-----mysql connect error:", err)}if Db.Error != nil {fmt.Println("-----database err:", err)}Db.DB().SetMaxIdleConns(10)Db.DB().SetMaxOpenConns(100)Db.DB().SetConnMaxLifetime(time.Hour)
}

本文根据小破站作者 慕课网官方账号 GO流行的Gin框架快速搭建开发 所著

在此感谢该博主讲的很棒! 

最后的最后,创作不易,希望读者三连支持 💖
赠人玫瑰,手有余香 💖

http://www.hkea.cn/news/183913/

相关文章:

  • 哪个网站专业做安防如何注册域名网站
  • 穆棱市住房和城乡建设局网站关键词词库
  • 成都网站建设市场什么是网络营销的核心
  • 深圳找人做网站廊坊优化外包
  • 衡阳市城市建设投资有限公司网站湖南企业seo优化报价
  • css做网站常用百度权重优化软件
  • 合合肥网站建设制作网站用什么软件
  • 杭州网站设计公司推荐网络推广与优化
  • 移动惠生活app下载网址荆门网站seo
  • 做网站很赚钱吗关键词自助优化
  • wordpress小工具里的用户中心南京谷歌优化
  • 网站开发中茶叶网络营销策划方案
  • 临海市住房与城乡建设规划局 网站目前最新的营销模式有哪些
  • 高校建设网站的特色如何建立一个网站
  • 公司做网站域名归谁搜索引擎营销策划方案
  • 怎么做外贸个人网站seo综合查询工具可以查看哪些数据
  • 黑客网站盗qq百度seo公司整站优化
  • 网页设计代码不能运行seo的中文名是什么
  • 灵溪网站建设外贸网站谷歌seo
  • 网站开发系统设计产品推销
  • 不用代码做网站 知乎百度引流推广怎么收费
  • 怎么看网站后台什么语言做的产品全网营销推广
  • 可以做宣传图的网站网络销售管理条例
  • 做书籍封皮的网站制作网站平台
  • 1网站建设公司长沙网站到首页排名
  • 域名还在备案可以做网站吗seo培训班
  • 前程无忧网宁波网站建设类岗位北京网站快速排名优化
  • 如何优化网站内部链接站长工具站长之家
  • 阿里云网站建设的实训报告免费的自媒体一键发布平台
  • 关于加强网站建设的意见企业获客方式