国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

golang微框架Gin

這篇具有很好參考價值的文章主要介紹了golang微框架Gin。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Gin簡介

Gin是一個golang的微框架,基于httprouter,封裝比較優(yōu)雅,API友好,源碼注釋比較明確,具有快速靈活,容錯方便等特點

Gin特征

速度快:基于基數(shù)樹的路由,內(nèi)存占用小,沒有反射,可預測的APi性能

中間件支持

傳入的http請求可以有中間件鏈和最終操作處理,例如:Logger,Authorization,GZip最后在Db中發(fā)布以條消息

Crash-free

Gin可以捕獲Http請求期間發(fā)生的panic并恢復它,這樣你的服務器始終都可用

JSON驗證

Gin可以解析和驗證請求的JSON——例如,檢查所需的值是否存在

路由分組

更好的組織您的路線,需要授權(quán)與不需要授權(quán),不同的API版本,此外,組可以無限嵌套,而不會降低性能

錯誤管理

Gin提供了一種方便的方法用來收集HTTP請求期間發(fā)生的所有錯誤,最終 ,中間件可以將它們寫入日志,數(shù)據(jù)并通過網(wǎng)絡發(fā)送他們

內(nèi)置渲染

GIn為JSon,XML,HTML渲染提供了簡單易用·的API

可擴展

創(chuàng)建一個新的中間件非常簡單,只需要查看實例代碼就可以

第一個Gin

安裝Gin

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

導入項目

import "github.com/gin-gonic/gin"

實現(xiàn)代碼

package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080
}

Gin實現(xiàn)用戶登錄

實現(xiàn)步驟

創(chuàng)建一個文件templates

在項目根目錄下邊創(chuàng)建文件夾templtes,用來保存靜態(tài)文件

創(chuàng)建一個登錄的html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
</head>
<body>

    <form action="/login" method="post">
        Username: <input type="text" name="username"><br>
        Password: <input type="password" name="password"><br>
        <input type="submit" value="Login">
    </form>
    
</body>
</html>

創(chuàng)建一個歡迎h(huán)tml頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Welcome</title>
</head>
<body>

    Welcome, {{.username}}
    
</body>
</html>

使用Gin處理邏輯

package main

import "github.com/gin-gonic/gin"

func MyHandler(c *gin.Context) {
	c.JSON(200, gin.H{
		"hello": "hello world",
	})
}

func Login(c *gin.Context) {
	c.HTML(200, "login.html", nil)
}

func DoLogin(c *gin.Context) {
	username := c.PostForm("username")
	password := c.PostForm("password")

	c.HTML(200, "welcome.html", gin.H{
		"username": username,
		"password": password,
	})

}

func main() {
	e := gin.Default()
	e.LoadHTMLGlob("templates/*")

	e.GET("/login", Login)
	e.POST("/login", DoLogin)
	e.Run()
}

使用Gin請求參數(shù)

Get請求參數(shù)
使用c.Query(“key”),或者c.DefaultQuery(”key”)方法

package main

import "github.com/gin-gonic/gin"

func TestQueryString(c *gin.Context) {
	username := c.Query("username")
	site := c.DefaultQuery("site", "www.duoke360.com")

	c.String(200, "username:%s, site:%s", username, site)
}

func main() {

	e := gin.Default()
	// url : http://localhost:8080/testQueryString?username=郭宏志&site=多課網(wǎng)
	e.GET("/testQueryString", TestQueryString)

	e.Run()

}

Gin數(shù)據(jù)綁定

綁定Form表單

package main

import (
	"github.com/gin-gonic/gin"
)

type User struct {
	Username string   `form:"username"`
	Password string   `form:"password"`
	Hobby    []string `form:"hobby"`
	Gender   string   `form:"gender"`
	City     string   `form:"city"`
}

func Regsiter(c *gin.Context) {
	var user User
	c.ShouldBind(&user)
	c.String(200, "User:%s", user)
}

func GoRegister(c *gin.Context) {
	c.HTML(200, "register.html", nil)
}

func main() {
	e := gin.Default()
	e.LoadHTMLGlob("templates/*")
	e.POST("/register", Regsiter)
	e.GET("/register", GoRegister)
	e.Run()
}

綁定查詢參數(shù)

package main

import (
	"log"

	"github.com/gin-gonic/gin"
)

type User struct {
	Username string `form:"username"`
	Password string `form:"password"`
}

func TestGetBind(c *gin.Context) {
	var user User
	err := c.ShouldBind(&user)
	if err != nil {
		log.Fatal(err)
	}
	c.String(200, "User:%s", user)
}

func main() {
	e := gin.Default()
	// http://localhost:8080/testGetBind?username=ghz&password=123
	e.GET("/testGetBind", TestGetBind)
	e.Run()
}

綁定路徑請求參數(shù)

package main

import (
	"log"

	"github.com/gin-gonic/gin"
)

type User struct {
	Username string `uri:"username"`
	Password string `uri:"password"`
}

func TestGetBind(c *gin.Context) {
	var user User
	err := c.ShouldBindUri(&user)
	if err != nil {
		log.Fatal(err)
	}
	c.String(200, "User:%s", user)
}

func main() {
	e := gin.Default()
	// http://localhost:8080/testGetBind/ghz/123
	e.GET("/testGetBind/:username/:password", TestGetBind)
	e.Run()
}

GIN 訪問靜態(tài)文件集成BootStrap框架

下載bootstrap
下載地址:
https://getbootstrap.com/

添加bootstrap css 和js 文件

創(chuàng)建一個assets文件夾 將 css和js文件添加到該文件夾中
創(chuàng)建html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="/assets/css/bootstrap.min.css">
    
    <title>Login</title>
</head>
<body>

   <div class="container">
    
    <form>
        <div class="mb-3">
          <label for="exampleInputEmail1" class="form-label">Email address</label>
          <input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp">
          <div id="emailHelp" class="form-text">We'll never share your email with anyone else.</div>
        </div>
        <div class="mb-3">
          <label for="exampleInputPassword1" class="form-label">Password</label>
          <input type="password" class="form-control" id="exampleInputPassword1">
        </div>
        <div class="mb-3 form-check">
          <input type="checkbox" class="form-check-input" id="exampleCheck1">
          <label class="form-check-label" for="exampleCheck1">Check me out</label>
        </div>
        <button type="submit" class="btn btn-primary">Submit</button>
      </form>
   </div>
    
</body>
</html>

go code
package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

func Login(c *gin.Context) {
	c.HTML(200, "login.html", nil)
}

func main() {
	e := gin.Default()
	e.LoadHTMLGlob("templates/*")

	e.Static("/assets", "./assets")
	e.StaticFS("/croot", http.Dir("c:/"))
	e.StaticFile("/favicon.ico", "./assets/favicon.ico")

	e.GET("/login", Login)
	e.POST("/login", DoLogin)
	e.Run()
}

Gin使用中間件

中間件聽起來非常高大上的名字,實際上非常簡單,就是在請求中間其攔截作用的處理函數(shù)

Gin默認中間件

如果你使用Gin.Default實例化gin引擎,默認有倆個中間件,LOgger和Recover,分別用來處理日志和處理錯誤,如果使用Gin.New需要重新添加

// 新建一個沒有任何默認中間件的路由
r := gin.New()

// 全局中間件
// Logger 中間件將日志寫入 gin.DefaultWriter,即使你將 GIN_MODE 設置為 release。
// By default gin.DefaultWriter = os.Stdout
r.Use(gin.Logger())

// Recovery 中間件會 recover 任何 panic。如果有 panic 的話,會寫入 500。
r.Use(gin.Recovery())

自定義中間件

1.自定義中間件非常簡單,定義一個符合下邊格式的處理函數(shù)
type HandlerFunc func(*Context)
2.使用Use方法調(diào)用

package main

import (
	"fmt"

	"github.com/gin-gonic/gin"
)

func TestMW(c *gin.Context) {
	c.String(200, "hello,%s", "ghz")
}

func MyMiddleware1(c *gin.Context) {
	fmt.Println("我的第一個中間件")
}

func MyMiddleware2(c *gin.Context) {
	fmt.Println("我的第二個中間件")
}

func main() {

	/* 	func Default() *Engine {
		debugPrintWARNINGDefault()
		engine := New()
		engine.Use(Logger(), Recovery())
		return engine
	} */
	// e := gin.Default()
	// e := gin.New()

	e := gin.Default()

	e.Use(MyMiddleware1, MyMiddleware2)

	e.GET("testmw", TestMW)

	e.Run()

}

使用Gin BasicAuth中間件

Gin提供了BasicAuth的中間件,用來對網(wǎng)絡資源的訪問保護
實例:

package main

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

// 模擬一些私人數(shù)據(jù)
var secrets = gin.H{
	"foo":    gin.H{"email": "foo@bar.com", "phone": "123433"},
	"austin": gin.H{"email": "austin@example.com", "phone": "666"},
	"lena":   gin.H{"email": "lena@guapa.com", "phone": "523443"},
}

func main() {
	r := gin.Default()

	// 路由組使用 gin.BasicAuth() 中間件
	// gin.Accounts 是 map[string]string 的一種快捷方式
	authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{
		"foo":    "bar",
		"austin": "1234",
		"lena":   "hello2",
		"manu":   "4321",
	}))

	// /admin/secrets 端點
	// 觸發(fā) "localhost:8080/admin/secrets
	authorized.GET("/secrets", func(c *gin.Context) {
		// 獲取用戶,它是由 BasicAuth 中間件設置的
		user := c.MustGet(gin.AuthUserKey).(string)
		fmt.Println(user)
		if secret, ok := secrets[user]; ok {
			c.JSON(http.StatusOK, gin.H{"user": user, "secret": secret})
		} else {
			c.JSON(http.StatusOK, gin.H{"user": user, "secret": "NO SECRET :("})
		}
	})

	// 監(jiān)聽并在 0.0.0.0:8080 上啟動服務
	r.Run(":8080")
}

測試

在瀏覽器中輸入localhost:8080/admin/secrets時,會彈出一個對話框,要求輸入正確的用戶名和密碼,才能訪問資源。

Gin cookie的使用

cookie是服務器向客戶端寫的一些數(shù)據(jù),可以實現(xiàn)像自動登陸等功能
Gin cookie的使用

package main

import "github.com/gin-gonic/gin"

func Handler(c *gin.Context) {
	// 獲得cookie
	s, err := c.Cookie("username")
	if err != nil {
		s = "ghz"
		// 設置cookie
		c.SetCookie("username", s, 60*60, "/", "localhost", false, true)
	}

	c.String(200, "測試cookie")
}

func main() {
	e := gin.Default()
	e.GET("/test", Handler)
	e.Run()
}

Gin使用session

因為http是無狀態(tài)短連接 ,如何保存客戶端和服務器直接的會話狀態(tài)呢?可以使用session

使用gin session中間件

gin本身沒有對session的支持,可以使用第三方中間件

go get github.com/gin-contrib/sessions
import "github.com/gin-contrib/sessions"

該中間件提更了很多后端支持:
cookie-based
redis
memcached
MongoDB
memstore
PostgreSQL
實例:

package main

import (
  "github.com/gin-contrib/sessions"
  "github.com/gin-contrib/sessions/cookie"
  "github.com/gin-gonic/gin"
)

func main() {
  r := gin.Default()
  store := cookie.NewStore([]byte("secret"))
  r.Use(sessions.Sessions("mysession", store))

  r.GET("/hello", func(c *gin.Context) {
    session := sessions.Default(c)

    if session.Get("hello") != "world" {
      session.Set("hello", "world")
      session.Save()
    }

    c.JSON(200, gin.H{"hello": session.Get("hello")})
  })
  r.Run(":8000")
}

Gin實現(xiàn)restful風格的CURD

package main

import (
	"fmt"
	"strconv"
	"github.com/gin-gonic/gin"
)

type User struct {
	UId  int    `json:"uid"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

var users = make([]User, 3)

func init() {
	u1 := User{1, "tom", 20}
	u2 := User{2, "kite", 30}
	u3 := User{3, "rose", 40}
	users = append(users, u1)
	users = append(users, u2)
	users = append(users, u3)
	fmt.Println(users)
}

func find(uid int) (*User, int) {
	for i, u := range users {
		if u.UId == uid {
			return &u, i
		}
	}
	return nil, -1
}

func AddUser(c *gin.Context) {
	u4 := User{4, "Joe", 50}
	users = append(users, u4)
	c.JSON(200, users)
}
func DelUser(c *gin.Context) {
	uid := c.Param("uid")
	id, _ := strconv.Atoi(uid)
	_, i := find(id)
	users = append(users[:i], users[i+1:]...)
	c.JSON(200, users)
}

func UpdateUser(c *gin.Context) {
	uid := c.Param("uid")
	id, _ := strconv.Atoi(uid)
	u, _ := find(id)
	u.Name = "修改的Name"
	c.JSON(200, u)
}

func FindUser(c *gin.Context) {
	uid := c.Param("uid")
	id, _ := strconv.Atoi(uid)
	u, _ := find(id)
	c.JSON(200, u)
}
func main() {

	e := gin.Default()
	e.GET("/user/:uid", FindUser)
	e.PUT("/user/:uid", UpdateUser)
	e.DELETE("/user/:uid", DelUser)
	e.POST("/user/", AddUser)
	e.Run()

}

Gin實現(xiàn)路由分組

假如你的網(wǎng)站上有很多個模塊:博客,教程,視頻,回答,每個模塊又有很多個路由,這樣就可以進行路由分組,使用的方法是router.Group(“分組名稱”)

package main

import "github.com/gin-gonic/gin"

func F1(c *gin.Context) {}
func F2(c *gin.Context) {}
func F3(c *gin.Context) {}
func F4(c *gin.Context) {}
func F5(c *gin.Context) {}
func F6(c *gin.Context) {}

func main() {
	router := gin.Default()

	// 博客
	// 訪問:http://localhost:8080/blog/list
	v1 := router.Group("/blog")
	{
		v1.POST("/list", F1)
		v1.POST("/post", F2)
		v1.POST("/add", F3)
	}

	// 視頻
	// 訪問:http://localhost:8080/video/list
	v2 := router.Group("/video")
	{
		v2.POST("/list", F4)
		v2.POST("/post", F5)
		v2.POST("/add", F6)
	}

	router.Run(":8080")
}

Gin輸出渲染

Gin支持很多種輸出渲染,可以是簡單的字符串,Json,xml,html,protoBuf。使用的方法如下:

c.JSON(200, nil)
c.XML(200, nil)
c.HTML(200, "", nil)
c.String(200, "")
c.ProtoBuf(200, nil)

這里像字符串,json,html我們都用過,這里我們再總結(jié)一下:

package main

import "github.com/gin-gonic/gin"

func TestJson(c *gin.Context) {
	c.JSON(200, gin.H{
		"name": "多課網(wǎng)",
		"site": "www.duoke360.com",
	})
}

func TestXML(c *gin.Context) {
	c.XML(200, gin.H{
		"name": "多課網(wǎng)",
		"site": "www.duoke360.com",
	})
}

func TestHtml(c *gin.Context) {
	c.HTML(200, "login.html", nil)
}

func TestString(c *gin.Context) {
	c.String(200, "多課網(wǎng),老郭講golang")
}

func main() {
	e := gin.Default()

	e.GET("/test_json", TestJson)
	e.GET("/test_xml", TestXML)
	e.LoadHTMLGlob("templates/*")
	e.GET("/test_html", TestHtml)
	e.GET("/test_string", TestString)

> 這里是引用

	e.Run()
}

Gin實現(xiàn)文件上傳

創(chuàng)建xml文件文章來源地址http://www.zghlxwxcb.cn/news/detail-708870.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <form action="/upload" method="post" enctype="multipart/form-data">
    請選擇上傳文件:<input type="file" name="file" id=""><br>
    <input type="submit" value="上傳">
    </form>
    
</body>
</html>

Go code

package main

import (
	"fmt"
	"log"
	"net/http"

	"github.com/gin-gonic/gin"
)

func Upload(c *gin.Context) {
	// 單文件
	file, _ := c.FormFile("file")
	log.Println(file.Filename)

	// 上傳文件到項目根目錄,使用原文件名
	c.SaveUploadedFile(file, file.Filename)

	c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
}

func GoUpload(c *gin.Context) {
	c.HTML(200, "upload.html", nil)
}

func main() {
	router := gin.Default()
	// 為 multipart forms 設置較低的內(nèi)存限制 (默認是 32 MiB)
	router.MaxMultipartMemory = 8 << 20 // 8 MiB
	router.LoadHTMLGlob("templates/*")
	router.GET("/upload", GoUpload)
	router.POST("/upload", Upload)
	router.Run(":8080")
}

到了這里,關于golang微框架Gin的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • [golang gin框架] 37.ElasticSearch 全文搜索引擎的使用

    [golang gin框架] 37.ElasticSearch 全文搜索引擎的使用

    ElasticSearch 是一個基于 Lucene 的 搜索服務器 ,它提供了一個 分布式多用戶 能力的 全文搜索引擎 ,基于 RESTful web 接口,Elasticsearch 是用 Java 開發(fā)的,并作為 Apache 許可條款下的開放源碼發(fā)布,是當前流行的企業(yè)級搜索引擎,設計用于云計算中,能夠達到 實時搜索 , 穩(wěn)定 , 可靠

    2024年02月11日
    瀏覽(21)
  • [golang gin框架] 38.Gin操作Elasticsearch創(chuàng)建索引、修改映射、數(shù)據(jù)CURD以及數(shù)據(jù)分頁

    常見的 Golang 操作 ElasticSearch 的插件主要有下面兩個: 第三方插件: github.com/olivere/elastic 官網(wǎng)插件 github.com/elastic/go-elasticsearch 其中 elastic 比 go-elasticsearch 文檔更全面一些,start 量也更多一些,本節(jié)講解 elastic 使用第三方庫 https://github.com/olivere/elastic 來連接 ES 并進行操作 注意

    2024年02月09日
    瀏覽(25)
  • [golang gin框架] 45.Gin商城項目-微服務實戰(zhàn)之后臺Rbac微服務之角色權(quán)限關聯(lián)

    [golang gin框架] 45.Gin商城項目-微服務實戰(zhàn)之后臺Rbac微服務之角色權(quán)限關聯(lián)

    角色和權(quán)限的關聯(lián)關系在前面文章中有講解,見[golang gin框架] 14.Gin 商城項目-RBAC管理之角色和權(quán)限關聯(lián),角色授權(quán),在這里通過微服務來實現(xiàn) 角色對權(quán)限的授權(quán) 操作,這里要實現(xiàn)的有兩個功能,一個是進入授權(quán),另一個是,授權(quán)提交操作,頁面如下: ?這里需要在proto/rbacRole.proto中增加

    2024年02月14日
    瀏覽(30)
  • [golang gin框架] 26.Gin 商城項目-前臺自定義商品列表模板, 商品詳情數(shù)據(jù)渲染,Markdown語法使用

    [golang gin框架] 26.Gin 商城項目-前臺自定義商品列表模板, 商品詳情數(shù)據(jù)渲染,Markdown語法使用

    當在首頁分類點擊進入分類商品列表頁面時,可以根據(jù)后臺分類中的分類模板跳轉(zhuǎn)到對應的模板商品列表頁面 (1).商品控制器方法Category()完善 修改controllers/frontend/productController.go中的方法Category(), 判斷分類模板,如果后臺沒有設置,則使用默認模板 (2).模板頁面案例 先來回顧一

    2024年02月01日
    瀏覽(27)
  • [golang gin框架] 42.Gin商城項目-微服務實戰(zhàn)之后臺Rbac微服務角色增刪改查微服務

    [golang gin框架] 42.Gin商城項目-微服務實戰(zhàn)之后臺Rbac微服務角色增刪改查微服務

    上一節(jié)講解了后臺Rbac微服務用戶登錄功能以及Gorm數(shù)據(jù)庫配置單獨抽離,Consul配置單獨抽離,這一節(jié)講解 后臺Rbac微服務 角色 增刪改查微服務 功能,Rbac微服務角色增刪改查微服務和 后 臺Rbac用戶登錄微服務 是屬于 同一個Rbac微服務 的 不同子微服務功能 ,為了區(qū)分不同子微

    2024年02月15日
    瀏覽(24)
  • [golang gin框架] 44.Gin商城項目-微服務實戰(zhàn)之后臺Rbac微服務之權(quán)限的增刪改查微服務

    [golang gin框架] 44.Gin商城項目-微服務實戰(zhàn)之后臺Rbac微服務之權(quán)限的增刪改查微服務

    上一節(jié)講解了[golang gin框架] 43.Gin商城項目-微服務實戰(zhàn)之后臺Rbac微服務之管理員的增刪改查以及管理員和角色關聯(lián),這里講解權(quán)限管理Rbac微服務權(quán)限的增刪改查微服務 要實現(xiàn)權(quán)限的增刪改查,就需要創(chuàng)建對應的模型,故在server/rbac/models下創(chuàng)建Access.go模型文件,參考[golang gin框架]

    2024年02月14日
    瀏覽(20)
  • [golang gin框架] 43.Gin商城項目-微服務實戰(zhàn)之后臺Rbac微服務之管理員的增刪改查以及管理員和角色關聯(lián)

    [golang gin框架] 43.Gin商城項目-微服務實戰(zhàn)之后臺Rbac微服務之管理員的增刪改查以及管理員和角色關聯(lián)

    上一節(jié)講解了后臺Rbac微服務角色增刪改查微服務,這里講解權(quán)限管理Rbac微服務管理員的增刪改查微服務以及管理員和角色關聯(lián)微服務功能 要實現(xiàn)管理員的增刪改查,就需要創(chuàng)建對應的模型,故在server/rbac/models下創(chuàng)建manager.go模型文件,參考[golang gin框架] 14.Gin 商城項目-RBAC管理代碼

    2024年02月14日
    瀏覽(38)
  • Golang | Web開發(fā)之Gin多服務配置及優(yōu)雅關閉平滑重啟

    Golang | Web開發(fā)之Gin多服務配置及優(yōu)雅關閉平滑重啟

    歡迎關注「 全棧工程師修煉指南 」公眾號 點擊 ??? 下方卡片 ?即可關注我喲! 設為 「 星標? 」 每天帶你? 基礎入門? 到? 進階實踐 ?再到? 放棄學習 ! 專注? 企業(yè)運維實踐、網(wǎng)絡安全、系統(tǒng)運維、應用開發(fā)、物聯(lián)網(wǎng)實戰(zhàn)、全棧文章? 等知識分享 “ ?? 花開堪折直須折

    2024年02月08日
    瀏覽(26)
  • Go語言web框架——Gin

    Go語言web框架——Gin

    Gin是一個go語言寫的Web框架 客戶機通過TCP/IP協(xié)議建立到服務器的TCP連接 客戶端向服務器發(fā)送HTTP協(xié)議請求 Request GET /url ,請求服務器里的資源文檔 服務器向客戶機發(fā)送HTTP協(xié)議應答Response,如果請求的資源包含有動態(tài)語言的內(nèi)容,那么服務器會調(diào)用動態(tài)語言的解釋引擎負責處理

    2023年04月14日
    瀏覽(24)
  • go語言Gin框架常見面試題(1)

    Gin框架是一種基于Go語言的輕量級Web框架,具有高效、快速、易用等優(yōu)點。Gin采用了類似于Expres

    2024年02月08日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包