您好,登錄后才能下訂單哦!
Golang中GinWeb框架如何使用,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
安裝
Go版本要求: Go1.12及以上
1. 執行以下命令安裝最新版本Gin
$ go get -u github.com/gin-gonic/gin
2. 在你的代碼中導入
import "github.com/gin-gonic/gin"
3. (可選)導入net/http包, 如果你要使用其中的常量,比如http.StatusOK,則需要導入
import "net/http"
快速開始
編寫main.go,寫入以下代碼并執行go run main.go, 訪問http://localhost:8080/ping, 就可以得到響應消息{"message": "pong"}
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() //創建默認Gin引擎Engine,內部默認開啟了日志和異常恢復中間件 r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() //默認在localhost:8080監聽 }
基準測試
測試結果說明:
Benchmark name: 基準測試項
第(1)列:在固定時間內完成的重復次數, 值越大性能好
第(2)列:執行單次重復任務消耗的納秒數, 單位ns/op, 值越低越好
第(3)列:執行單次重復任務消耗的堆內存字節數, 單位B/op, 值越低越好
第(4)列:每個重復任務平均分配內存的次數, 單位allocs/op, 值越低越好
Gin V1穩定版特性
零內存分配的路由器
仍然是最快的http路由器和框架
完整的單元測試
嚴格測試
API版本凍結,新發布的版本對你原來的代碼兼容
使用jsoniter編譯
jsoniter(https://github.com/json-iterator/go)是一個高性能可以替代Golang標準庫encoding/json并且完全兼容的包
Gin默認使用encoding/json包,但是你可以使用以下tags修改為jsoniter重新編譯源碼
go build -tags=jsoniter .
API示例
你可以訪問源碼,查看更多接口示例代碼:https://github.com/gin-gonic/examples
使用GET,POST,PUT,PATCH,DELETE,OPTIONS
func main() { // Creates a gin router with default middleware: // logger and recovery (crash-free) middleware router := gin.Default() router.GET("/someGet", getting) router.POST("/somePost", posting) router.PUT("/somePut", putting) router.DELETE("/someDelete", deleting) router.PATCH("/somePatch", patching) router.HEAD("/someHead", head) router.OPTIONS("/someOptions", options) // By default it serves on :8080 unless a // PORT environment variable was defined. router.Run() // router.Run(":3000") for a hard coded port 指定端口 }
路徑參數
func main() { router := gin.Default() // This handler will match /user/john but will not match /user/ or /user //以下路由只會匹配/user/用戶名, 不會匹配/user/或者/user router.GET("/user/:name", func(c *gin.Context) { name := c.Param("name") //使用Param方法從路徑中獲取參數 c.String(http.StatusOK, "Hello %s", name) }) // However, this one will match /user/john/ and also /user/john/send // If no other routers match /user/john, it will redirect to /user/john/ // 以下帶冒號:和帶星號*組成的路由可以匹配/user/用戶名/或/user/用戶名/動作,如果/user/用戶名沒有匹配到其他路由,它會自動重定向到/user/用戶名/進行匹配 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) }) // For each matched request Context will hold the route definition // 請求上下文request Context會保存所有匹配上的路由定義到c.FullPath()方法 router.POST("/user/:name/*action", func(c *gin.Context) { c.FullPath() == "/user/:name/*action" // true }) router.Run(":8080") }
查詢字符串參數
func main() { router := gin.Default() // Query string parameters are parsed using the existing underlying request object. // The request responds to a url matching: /welcome?firstname=Jane&lastname=Doe // 發送測試請求:/welcome?firstname=Jane&lastname=Doe router.GET("/welcome", func(c *gin.Context) { firstname := c.DefaultQuery("firstname", "Guest") //如果沒有獲取到該鍵值,則使用第二個參數作為默認值 lastname := c.Query("lastname") //上一行的完整寫法:c.Request.URL.Query().Get("lastname") c.String(http.StatusOK, "Hello %s %s", firstname, lastname) }) router.Run(":8080") }
URL編碼的多種數據類型組成的表單請求
請求內容類型為:application/x-www-form-urlencoded
Content-Type: application/x-www-form-urlencoded
package main import "github.com/gin-gonic/gin" func main() { router := gin.Default() // 模擬提交表單:curl -XPOST http://localhost:8080/form_post -d "message=消息&nick=昵稱" router.POST("/form_post", func(c *gin.Context) { message := c.PostForm("message") nick := c.DefaultPostForm("nick", "anonymous") c.JSON(200, gin.H{ "status": "posted", "message": message, "nick": nick, }) }) router.Run(":8080") } //返回結果: {"message":"消息","nick":"昵稱","status":"posted"}
查詢和提交Post表單相結合
package main import ( "fmt" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() router.POST("/post", func(c *gin.Context) { id := c.Query("id") page := c.DefaultQuery("page", "0") name := c.PostForm("name") message := c.PostForm("message") fmt.Printf("id: %s; page: %s; name: %s; message: %s\n", id, page, name, message) c.JSON(200, gin.H{ "id": id, "page": page, "name": name, "message": message, }) }) router.Run(":8080") }
模擬發送請求:
curl -XPOST http://localhost:8080/post?id=1234&page=1 -d "name=manu&message=this_is_great"
返回結果:
{"id":"1234","message":"this_is_great","name":"manu","page":"1"}
以Map映射作為查詢字符串或Post表單參數
func main() {
router := gin.Default()
router.POST("/post", func(c *gin.Context) {
ids := c.QueryMap("ids") //獲取查詢參數中的Map
names := c.PostFormMap("names") //獲取Post表單中的Map
fmt.Printf("ids: %v; names: %v\n", ids, names)
})
router.Run(":8080")
}
模擬請求: curl -XPOST http://localhost:8080/post?ids[a]=1234&ids[b]=hello -d "names[first]=thinkerou&names[second]=tianou" 打印結果: ids: map[a:1234 b:hello]; names: map[first:thinkerou second:tianou]
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。