Golang 的Gin框架入门教学

学习Golang差很少有一个星期时间,开始本身作点小功能,练练手。

Gin 介绍

Gin 是一个 Golang 写的 web 框架,具备高性能的优势,,基于 httprouter,
它提供了相似martini但更好性能(路由性能约快40倍)的API服务。
官方地址:https://github.com/gin-gonic/gin

安装框架

配置好GOPATH,建议本身在GOPATH建个项目,这里我以aze.org做为项目目录。mysql

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

安装mysql驱动

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

组织项目

通过上面的model和handler的分离,代码结构变得更加清晰,但是咱们仍是单文件。下一步将进行封装不一样的包。golang

数据库处理

在项目根目录建立下面三个文件夹,apis,databases和models,并在文件夹内建立文件。此时咱们的目录结果以下web

Golang 的Gin框架入门教学

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的习惯,变量名必须大写开头。sql

数据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包json

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,咱们在路由文件中封装路由函数api

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函数结束的时候,关闭全局的数据库链接池:restful

main.go

package main

import (
 db "aze.org/database"
)

func main() {
 defer db.SqlDB.Close()
 router := initRouter()
 router.Run(":8000")
}

此时运行项目,不能像以前简单的使用go run main.go,由于包main包含main.go和router.go的文件,所以须要运行go run *.go命令编译运行。若是是最终编译二进制项目,则运行go build -o app,生成app文件直接./app就能够运行项目了。

总结

1.经过上述的实践,咱们了解了Gin框架建立基本的的restful服务。
2.golang 关键字很少,可是语法仍是挺多的,须要认真学习,打好基础。
3.多看优秀的框架,再进行思考有没有更好的写法。

参考教程:

Gin框架 详细文档地址:https://godoc.org/github.com/gin-gonic/gin

项目地址:

https://github.com/onebig32/gin-learn.git

相关文章
相关标签/搜索