Golang框架Gin的入门使用

序言

  • Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,已经发布了1.0版本。具有快速灵活,容错方便等特点,目前在app以及web端的使用都比较多.
  • 在本文中主要通过一个简单的例子对其进行简单的记录,方便在之后的使用中能够方便的查阅基础知识.

相关资料

代码解释

  • 数据库连接
    在本文中通过对数据库的插入以及查询完成gin的两个接口,以便对gin有一个初步的了解。本文使用go-sql-driver完成对MySql数据库的驱动及先关操作,代码如下所示:
1
2
3
4
5
6
7
8
9
10
db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/test?parseTime=true")
defer db.Close()
if err != nil {
log.Fatalln(err)
}
db.SetMaxIdleConns(20)
db.SetMaxOpenConns(20)
if err := db.Ping(); err != nil {
log.Fatalln(err)
}

在这里需要根据自己的MySql配置来做相应的调整,具体可见go-sql-driver详细说明。

  • router声明
    需要首先声明router,用于接下来的接口操作,代码如下:
1
router := gin.Default()
  • 数据插入操作
    该接口通过传入两个参数完成数据库数据的插入功能,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
router.GET("/insert", func(c *gin.Context) {
firstName := c.Request.FormValue("first_name")
lastName := c.Request.FormValue("last_name")
rs, err := db.Exec("INSERT INTO person(first_name, last_name) VALUES (?, ?)", firstName, lastName)
if err != nil {
log.Fatalln(err)
}
id, err := rs.LastInsertId()
if err != nil {
log.Fatalln(err)
}
fmt.Println("insert person Id {}", id)
msg := fmt.Sprintf("insert successful %d", id)
c.JSON(http.StatusOK, gin.H{"msg": msg})
})

在上面的代码中,主要分为三个部分,分别为获取参数、业务逻辑、数据相应三个部分。

- 获取参数
gin提供了简便的方法为我们获取请求参数所使用,如下代码所示:
1
2
  	firstName := c.Request.FormValue("first_name")
lastName := c.Request.FormValue("last_name")
- 业务逻辑 在此接口中,主要的业务逻辑就是实现数据的插入功能,在之前已经对MySql做了驱动,所以在这里直接使用即可:
1
2
3
4
  rs, err := db.Exec("INSERT INTO person(first_name, last_name) VALUES (?, ?)", firstName, lastName)
if err != nil {
log.Fatalln(err)
}
- 数据响应 在进行接口编写时需要有数据响应给前端做相应的处理,在这里gin也封装了数据相应的方法及解释,我们直接进行调用即可:
1
2
3
4
5
6
7
  	id, err := rs.LastInsertId()
if err != nil {
log.Fatalln(err)
}
fmt.Println("insert person Id {}", id)
msg := fmt.Sprintf("insert successful %d", id)
c.JSON(http.StatusOK, gin.H{"msg": msg})
  • 数据查询接口
    数据查询与之前的插入其实并没有太大的差别,只是需要对查询到的数据做一个解析操作,以便对前端做出规定格式的数据响应,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
router.GET("/query", func(c *gin.Context) {
rows, err := db.Query("SELECT id, first_name, last_name FROM person")
defer rows.Close()
if err != nil {
log.Fatalln(err)
}
persons := make([]Person, 0)
for rows.Next() {
var person Person
rows.Scan(&person.Id, &person.FirstName, &person.LastName)
persons = append(persons, person)
}
if err = rows.Err(); err != nil {
log.Fatalln(err)
}
c.JSON(http.StatusOK, gin.H{
"persons": persons,
})
})
  • 路径参数
    在gin中我们也可以像Java一样使用action来对path做解析,但这里又与Java有所不同,直接看代码或许比较直观:
1
2
3
4
5
6
router.GET("/user/:name/*action", func(c *gin.Context) {
name := c.Param("name")
action := c.Param("action")
message := name + " is " + action
c.String(http.StatusOK, message)
})

入代码所示,在使用时检测name与action,如果我们的path为/user/gin/test,那么解析到的name就是gin,而action就是test.

demo运行如图所示:
run

文章目录
  1. 1. 序言
  2. 2. 相关资料
  3. 3. 代码解释