第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開發(fā)者教程

Go 入門教程

Go 語(yǔ)言基礎(chǔ)教程
01 Go語(yǔ)言簡(jiǎn)介 02 Go 在 Windows 上的安裝及配置 03 Go 在 Linux 上的安裝與配置 04 Go 在 MacOS 上的安裝及配置 05 Git 的下載和安裝 06 VSCode 編輯器安裝和配置 07 Go 的變量聲明 08 Go 的變量賦值 09 Go 語(yǔ)言的 := 10 Go 的整型(int) 11 Go 的無(wú)符號(hào)整型(uint) 12 Go 的浮點(diǎn)型(float) 13 Go 的字符類型 14 Go 的布爾型(bool) 15 Go 的強(qiáng)制類型轉(zhuǎn)換 16 Go 語(yǔ)言的常量 17 Go 語(yǔ)言中代替枚舉的辦法 18 Go 語(yǔ)言中的運(yùn)算符 19 Go 語(yǔ)言的分支語(yǔ)句 20 Go 語(yǔ)言的循環(huán)語(yǔ)句 21 Go 語(yǔ)言的通道 22 Go 語(yǔ)言中的函數(shù) 23 Go 語(yǔ)言函數(shù)中的 defer 24 Go 語(yǔ)言中的閉包 25 Go 語(yǔ)言的指針 26 Go 語(yǔ)言中的數(shù)組 27 Go 語(yǔ)言中的切片 28 Go 語(yǔ)言中的 Map 29 Go 語(yǔ)言中的 range 30 Go 語(yǔ)言拓展以有類型 31 Go 語(yǔ)言中的結(jié)構(gòu)體和"面向?qū)ο?quot; 32 Go 語(yǔ)言中的接口 33 Go 語(yǔ)言類型的內(nèi)嵌 34 Go 語(yǔ)言中的 nil 35 Go 語(yǔ)言函數(shù)式編程 36 Go 語(yǔ)言中的錯(cuò)誤和異常處理 37 Go 語(yǔ)言的并發(fā) 38 Go 語(yǔ)言中的包 39 Go 語(yǔ)言 go mod 包依賴管理工具 40 Go 語(yǔ)言的文件操作 41 Go 語(yǔ)言中的系統(tǒng)包 42 Go 語(yǔ)言的 strings 系統(tǒng)包的使用 43 Go 語(yǔ)言中的變參 44 Go 語(yǔ)言中的反射 45 Go 語(yǔ)言性能測(cè)試 46 使用 Go 語(yǔ)言搭建簡(jiǎn)易登錄功能 47 使用 gin 包優(yōu)化登錄功能
首頁(yè) 慕課教程 Go 入門教程 Go 入門教程 47 使用 gin 包優(yōu)化登錄功能

上一個(gè)實(shí)戰(zhàn)文章我們學(xué)習(xí)了如何使用 Go 語(yǔ)言原生的 http 包來(lái)構(gòu)建一個(gè) web 應(yīng)用,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的登錄功能。因?yàn)樵?http 包很多功能都需要自己去寫,所以就有很多開發(fā)者在原生包的基礎(chǔ)上開發(fā)了第三方包。本文就來(lái)介紹一個(gè)開發(fā) Go web 十分流行的包—— gin 包。其官方地址為:https://github.com/gin-gonic/gin

1. 下載 gin 包

因?yàn)槭堑谌桨?,所以需要?github 上下載后才可使用。使用以下指令下載使用:

go get https://github.com/gin-gonic/gin

可能會(huì)比較久,如果覺得下載不便的話,可以直接使用 go mod 來(lái)構(gòu)建項(xiàng)目,就可以跳過(guò)下載這個(gè)步驟。

2. 搭建服務(wù)

本文將使用 go mod 來(lái)構(gòu)建項(xiàng)目,所以先在一個(gè)空白項(xiàng)目中執(zhí)行

go mod init

然后再在 Go 文件寫入以下代碼構(gòu)建 web 服務(wù),代碼示例:

package main

import (
    "github.com/gin-gonic/gin"//導(dǎo)入gin包
)

func main() {
    router := gin.Default()//實(shí)例化一個(gè)gin
    router.Run("127.0.0.1:9300")//監(jiān)聽9300端口
}

啟動(dòng)述代碼就可以啟動(dòng)一個(gè) gin 的 web 服務(wù),此時(shí)會(huì)打印一些 gin 的日志,表示服務(wù)已啟動(dòng)。

Tips:如果你事前沒(méi)有g(shù)in包,gomod會(huì)幫你自動(dòng)下載。

圖片描述

此時(shí)在在瀏覽器中輸入127.0.0.1:9300/index。會(huì)報(bào)出404,于此同時(shí),控制臺(tái)中會(huì)打印相關(guān)錯(cuò)誤,這個(gè)功能也是我很喜歡的一個(gè)功能。

圖片描述

3. 編寫路由

服務(wù)已經(jīng)啟動(dòng)了,接下來(lái)看看如何創(chuàng)建 gin 的路由。和前文一樣,我們先來(lái)創(chuàng)建一個(gè)處理 GET 請(qǐng)求的路由/index。

代碼示例:

package main

import (
    "net/http"

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

func main() {
    router := gin.Default()
    //創(chuàng)建get請(qǐng)求
    router.GET("/index", func(c *gin.Context) {
        c.String(http.StatusOK, "<h1>Hello Codey!</h1>")
    })
    router.Run("127.0.0.1:9300")
}

執(zhí)行上述代碼之后,在瀏覽器中輸入127.0.0.1:9300/index。

你會(huì)發(fā)現(xiàn)**<h1>這個(gè)標(biāo)簽沒(méi)有被瀏覽器識(shí)別,而是以字符串的形式輸出了**。

圖片描述

這是因?yàn)?gin 框架中對(duì)輸出做出了嚴(yán)格的分類,在 c.String() 函數(shù)中輸出的值只會(huì)是字符串的形式輸出,這是在原生函數(shù)之上為了**防止XSS(****跨站腳本攻擊)**而做的優(yōu)化。所以它無(wú)法直接打印 html 腳本來(lái)渲染頁(yè)面,必須要使用 c.HTML() 函數(shù)來(lái)加載 html 文件。

代碼示例:

package main

import (
    "net/http"

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

func main() {
    router := gin.Default()
    router.LoadHTMLGlob("view/*")//設(shè)定html存放的文件目錄
    router.GET("/index", func(c *gin.Context) {
        c.HTML(http.StatusOK, "index.html", nil)//打開view.index.html
    })
    router.Run("127.0.0.1:9300")
}

目錄結(jié)構(gòu)如下

圖片描述

index.html 代碼如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Go語(yǔ)言實(shí)戰(zhàn)2</title>
</head>
<body>
    <div>
        <h3>登錄</h3>
        <form action="check" method="POST">
            <div>
                <div>
                    <input type="text"  id="username" name="username" placeholder="請(qǐng)輸入賬號(hào)">
                </div>
            </div>
            <div>
                <div>
                    <input type="password" class="form-control" id="password" name="password" placeholder="請(qǐng)輸入密碼">
                </div>
            </div>
            <div >
                <div >
                    <button id="loginbtn" type="submit" >登錄</button>
                </div>
            </div>
        </form>
    </div>
</body>
</html>

執(zhí)行上述代碼之后,在瀏覽器中輸入127.0.0.1:9300/index。

圖片描述

此處可以結(jié)合函數(shù)式編程的思想,將 index 的處理函數(shù)拿出來(lái)作為一個(gè)變量,代碼修改后如下所示:

package main

import (
    "net/http"

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

func main() {
    router := gin.Default()
    router.LoadHTMLGlob("view/*")
    router.GET("/index", index)
    router.Run("127.0.0.1:9300")
}

func index(c *gin.Context) {
    c.HTML(http.StatusOK, "index.html", nil)
}

4. 數(shù)據(jù)傳輸

然后我們就用 gin 來(lái)寫一個(gè) post 服務(wù) check 用來(lái)接收驗(yàn)證登錄頁(yè)面發(fā)送過(guò)來(lái)的賬號(hào)密碼。

代碼示例:

package main

import (
    "fmt"
    "net/http"

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

func main() {
    router := gin.Default()
    router.LoadHTMLGlob("view/*")
    router.GET("/index", index)
    router.POST("/check", check)
    router.Run("127.0.0.1:9300")
}

func index(c *gin.Context) {
    c.HTML(http.StatusOK, "index.html", nil)
}

func check(c *gin.Context) {
    accountID, _ := c.GetPostForm("username")
    password, _ := c.GetPostForm("password")
    fmt.Println(accountID, password)
    if accountID == "Codey" && password == "12345" {
        //跳轉(zhuǎn)到主頁(yè)
        c.HTML(http.StatusOK, "home.html", nil)
    } else {
        //跳轉(zhuǎn)到登錄
        c.Writer.Write([]byte("<script>alert('賬號(hào)或者密碼不正確')</script>"))
        c.HTML(http.StatusOK, "index.html", nil)
    }

}

home.html 代碼如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Go語(yǔ)言實(shí)戰(zhàn)2</title>
</head>
<body>
    <div>
        <h3>主頁(yè)</h3>
       這里是主頁(yè)
    </div>
</body>
</html>

執(zhí)行上述 Go 語(yǔ)言代碼,在瀏覽器中輸入127.0.0.1:9300/index

圖片描述

輸入正確的賬號(hào):Codey,密碼:12345

圖片描述
然后點(diǎn)擊登錄,會(huì)跳轉(zhuǎn)到主頁(yè)

圖片描述

若輸入錯(cuò)誤的賬號(hào)密碼,則不跳轉(zhuǎn)

圖片描述

隨后跳轉(zhuǎn)回登錄頁(yè)面

圖片描述

在 gin 中一個(gè)簡(jiǎn)易的登錄功能就搭建完成了。

5. 小結(jié)

本文主要使用了gin這個(gè)第三方開發(fā)包,來(lái)搭建了一個(gè)Go語(yǔ)言的web應(yīng)用,這個(gè)gin包的本質(zhì)還是http包,但是它在其上封裝了一層接口,使我們可以更高效的開發(fā)以及開發(fā)出來(lái)的應(yīng)用更安全。在我們Go語(yǔ)言的學(xué)習(xí)和開發(fā)的過(guò)程中,在熟悉了官方庫(kù)之后,我們也可以去使用一些能更好的幫助我們開發(fā)的第三方包。