七叶笔记 » golang编程 » Golang 的Gin异步框架入门种简单例子

Golang 的Gin异步框架入门种简单例子

介绍

Gin 是一个用 Go (Golang) 编写的 HTTP web 框架。 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高了近 40 倍。如果你需要极好的性能,使用 Gin 吧。

安装框架

配置好GOPATH,建议自己在GOPATH建个项目,这里我以aze.org作为项目目录。

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

安装mysql驱动

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

组织项目

经过上面的model和handler的分离,代码结构变得更加清晰,可是我们还是单文件。下一步将进行封装不同的包。

数据库处理

在项目根目录创建下面三个文件夹,apis,databases和models,并在文件夹内创建文件。此时我们的目录结果如下

 apis文件夹存放我们的handler函数,models文件夹用来存放我们的数据模型。  

mysql.go:

 package database import ( "database/sql" _ "github.com/go-sql-driver/mysql" "log") var SqlDB *sql.DB func init() { var err error SqlDB, err = sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/test?parseTime=true") if err != nil {  log.Fatal(err.Error()) } err = SqlDB.Ping() if err != nil {  log.Fatal(err.Error()) }}  

因为我们需要在别的地方使用SqlDB这个变量,因此依照golang的习惯,变量名必须大写开头。

数据model封装

修改models文件夹下的person.go,把对应的Person结构及其方法移到这里:

 package models import ( "log" db "newland/database") type Person struct { Id        int    `json:"id" form:"id"` FirstName string `json:"first_name" form:"first_name"` LastName  string `json:"last_name" form:"last_name"`} func (p *Person) AddPerson() (id int64, err error) { rs, err := db.SqlDB.Exec("INSERT INTO person(first_name, last_name) VALUES (?, ?)", p.FirstName, p.LastName) if err != nil {  return } id, err = rs.LastInsertId() return} func (p *Person) GetPersons() (persons []Person, err error) { persons = make([]Person, 0) rows, err := db.SqlDB.Query("SELECT id, first_name, last_name FROM person") defer rows.Close()  if err != nil {  return }  for rows.Next() {  var person Person  rows.Scan(&person.Id, &person.FirstName, &person.LastName)  persons = append(persons, person) } if err = rows.Err(); err != nil {  return } return}..............  

handler

然后把具体的handler函数封装到api包中,因为handler函数要操作数据库,所以会引用model包

 package apis import ( "net/http" "log" "fmt" "github.com/gin-gonic/gin" . "aze.org/models") func IndexApi(c *gin.Context) { c.String(http.StatusOK, "It works")} func AddPersonApi(c *gin.Context) { firstName := c.Request.FormValue("first_name") lastName := c.Request.FormValue("last_name")  p := Person{FirstName: firstName, LastName: lastName}  ra, err := p.AddPerson() if err != nil {  log.Fatalln(err) } msg := fmt.Sprintf("insert successful %d", ra) c.JSON(http.StatusOK, gin.H{  "msg": msg, })} ......  

路由

最后就是把路由抽离出来,修改router.go,我们在路由文件中封装路由函数

 package main import ( "github.com/gin-gonic/gin" . "aze.orgd/apis") func initRouter() *gin.Engine { router := gin.Default()  router.GET("/", IndexApi)  router.POST("/person", AddPersonApi)  router.GET("/persons", GetPersonsApi)  router.GET("/person/:id", GetPersonApi)  router.PUT("/person/:id", ModPersonApi)  router.DELETE("/person/:id", DelPersonApi)  return router}  

app入口

最后就是main函数的app入口,将路由导入,同时我们要在main函数结束的时候,关闭全局的数据库连接池:

main.go

 package main import ( db "aze.org/database") func main() { defer db.SqlDB.Close() router := initRouter() router.Run(":8000")}  

总结

1.通过上述的实践,我们了解了Gin框架创建基本的的restful服务。
2.golang 关键字不多,但是语法还是挺多的,需要认真学习,打好基础。
3.多看优秀的框架,再进行思考有没有更好的写法。

参考教程

:可以后台私信‘资料’领取

相关文章