溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Golang 的Gin框架入門教學(xué)

發(fā)布時間:2020-06-16 08:43:08 來源:網(wǎng)絡(luò) 閱讀:23316 作者:阿澤Aze 欄目:開發(fā)技術(shù)
學(xué)習(xí)Golang差不多有一個星期時間,開始自己做點小功能,練練手。

Gin 介紹

Gin 是一個 Golang 寫的 web 框架,具有高性能的優(yōu)點,,基于 httprouter,
它提供了類似martini但更好性能(路由性能約快40倍)的API服務(wù)。
官方地址:https://github.com/gin-gonic/gin

安裝框架

配置好GOPATH,建議自己在GOPATH建個項目,這里我以aze.org作為項目目錄。

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

安裝mysql驅(qū)動

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

組織項目

經(jīng)過上面的model和handler的分離,代碼結(jié)構(gòu)變得更加清晰,可是我們還是單文件。下一步將進(jìn)行封裝不同的包。

數(shù)據(jù)庫處理

在項目根目錄創(chuàng)建下面三個文件夾,apis,databases和models,并在文件夾內(nèi)創(chuàng)建文件。此時我們的目錄結(jié)果如下

Golang 的Gin框架入門教學(xué)

apis文件夾存放我們的handler函數(shù),models文件夾用來存放我們的數(shù)據(jù)模型。
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的習(xí)慣,變量名必須大寫開頭。

數(shù)據(jù)model封裝

修改models文件夾下的person.go,把對應(yīng)的Person結(jié)構(gòu)及其方法移到這里:

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函數(shù)封裝到api包中,因為handler函數(shù)要操作數(shù)據(jù)庫,所以會引用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,我們在路由文件中封裝路由函數(shù)

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函數(shù)的app入口,將路由導(dǎo)入,同時我們要在main函數(shù)結(jié)束的時候,關(guān)閉全局的數(shù)據(jù)庫連接池:

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的文件,因此需要運行g(shù)o run *.go命令編譯運行。如果是最終編譯二進(jìn)制項目,則運行g(shù)o build -o app,生成app文件直接./app就可以運行項目了。

總結(jié)

1.通過上述的實踐,我們了解了Gin框架創(chuàng)建基本的的restful服務(wù)。
2.golang 關(guān)鍵字不多,但是語法還是挺多的,需要認(rèn)真學(xué)習(xí),打好基礎(chǔ)。
3.多看優(yōu)秀的框架,再進(jìn)行思考有沒有更好的寫法。

參考教程:

Gin框架 詳細(xì)文檔地址:https://godoc.org/github.com/gin-gonic/gin

項目地址:

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI