您好,登錄后才能下訂單哦!
學習Golang差不多有一個星期時間,開始自己做點小功能,練練手。
Gin 是一個 Golang 寫的 web 框架,具有高性能的優點,,基于 httprouter,
它提供了類似martini但更好性能(路由性能約快40倍)的API服務。
官方地址:https://github.com/gin-gonic/gin
配置好GOPATH,建議自己在GOPATH建個項目,這里我以aze.org
作為項目目錄。
$ go get github.com/gin-gonic/gin
$ 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的習慣,變量名必須大寫開頭。
修改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函數封裝到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
}
最后就是main函數的app入口,將路由導入,同時我們要在main函數結束的時候,關閉全局的數據庫連接池:
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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。