go學習(四)新建go的Web項目


一、vscode搭建Go環境

1、安裝go環境

官網golang中文網 ,下載xx.windows-amd64.msi
cmd查看版本:go version
我用的是golang 1.16.5,golang 1.18版本添加了泛型。

2、使用 Go Module

2.1 go module簡介

(1)不再需要GOROOT和GOPATH

使用Go Module進行包管理,就不再需要GOROOT和GOPATH了!

Go開發相關的環境變量(GOROOT和GOPATH)如下
GOROOT:GOROOT就是Go的安裝目錄,(類似於java的JDK)。不用往環境變量配置。包管理方式變成Go Module之后就用處不大了。
如,GOROOT = C:\Program Files\Go   

GOPATH:GOPATH是我們的工作空間,保存go項目代碼和第三方依賴包。安裝后,在環境變量中有。
如,GOPATH = %USERPROFILE%\go

參考:https://blog.csdn.net/qq_38151401/article/details/105729884

(2)使用 go module 管理依賴后會在項目根目錄下生成兩個文件 go.mod 和 go.sum。go.mod 中會記錄當前項目的所依賴的包的信息。

(3)在需要使用時才開啟GO111MODULE = on,平時GO111MODULE = off,避免在已有項目中意外引入 go module。

(4)go module 的目的是依賴管理,所以使用 go module 時你可以舍棄 go get 命令(但是不是禁止使用, 如果要指定包的版本或更新包可使用go get,平時沒有必要使用)

2.2 go module 配置步驟(win)

(1)設置GO111MODULE環境變量

set GO111MODULE=on   或者   go env -w GO111MODULE=on
go env // 查看 GO111MODULE 選項為 on 代表修改成功

1 要使用go module 首先要設置GO111MODULE=on,GO111MODULE 有三個值,off、on、auto。auto 會根據當前目錄下是否有 go.mod 文件來判斷是否使用 modules 功能。
2 平時 GO111MODULE = off,在需要使用的時候再開啟,避免在已有項目中意外引入 go module。

(2)配置代理

1 無論使用哪種模式,module 功能默認不在 GOPATH 目錄下查找依賴文件,所以使用 modules 功能時請設置好代理。
2 默認是Google訪問不到,需要設置代理才能用。【?】

Go version >= 1.13 時,直接使用go env -w命令就行了。【如果執行不了,重啟一下vs或終端】

//方法1:命令配置
go env -w GOPROXY=https://goproxy.cn,direct
//方法2:菜單配置
Preferences>Go>Go Modules>Environment GOPROXY=https://goproxy.cn,direct

其他版本:https://www.cnblogs.com/fanbi/p/13649929.html?ivk_sa=1024320u

2.2 命令

go mod init test // 初始化。先進入test項目下,然后執行此命令,項目根目錄會出現一個 go.mod 文件
go mod tidy // 檢測依賴。tidy會檢測該文件夾目錄下所有引入的依賴,寫入 go.mod 文件,寫入后你會發現 go.mod 文件有所變動
go mod download //下載依賴。我們需要將依賴下載至本地,而不是使用 go get
go mod vendor //導入依賴。此命令會將剛才下載至 GOPATH 下的依賴轉移至該項目根目錄下的 vendor(自動新建) 文件夾下, 此時我們就可以使用這些依賴了

//依賴更新:這里的更新不是指版本的更新,而是指引入新依賴,依賴更新請從檢測依賴部分一直執行即可:
go mod tidy
go mod download
go mod vendor

參考:
https://www.cnblogs.com/niuben/p/12560104.html

3、安裝vscode

迅雷去vscode官網下載。我用的是System Installer64 bit
解決vscode下載慢的問題:把/stable前的內容換成【vscode.cdn.azure.cn】,就變成了國內鏡像了,超快!

4、安裝插件

vscode-Extensions,搜索go安裝。

View-Command Palette...-Go:Install/Update Tools,全選安裝即可。

5、版本管理工具

gvm是第三方開發的Go多版本管理工具,這是目前在這方面做得最好的工具。

二、vscode新建Go項目

1、步驟

  1. 新建文件夾demo1,作為項目根目錄

  2. cmd,執行命令:go mod init demo1

  3. vscode打開文件:File-Open Folder,選擇項目根目錄demo1

  4. 新建main.go文件:File-New File,在根目錄下創建main.go文件

    package main // 可執行文件,package必須是main
    import (
    	"demo1/test"
    )
    
    func main(){
        test.F1()
    }
    
  5. 創建test包和F1函數:創建文件夾demo1/test,創建文件test1.go,內容如下。

    package test // 可以不與文件夾同名,但最好同名
    import (
        "fmt"
    )
    
    func F1(){ // 大寫開頭表示公有,小寫開頭表示私有
        fmt.Println("Hello World!")
    }
    
  6. 執行:Terminal-New Terminal,執行命令go run main.go

三、包管理:Go Module

1、Go的包管理發展

GOPATH ==> Go Vendor ==> Go Module

2、mod命令

// 常用命令
go mod init        // 初始化 go.mod,將開啟 mod 使用
go mod tidy        // 添加或者刪除 modules,取決於依賴的引用
go mod vendor      // 復制依賴到 vendor 目錄下
    
// 其它命令
go mod download  // 下載 module 到本地
go mod edit     //  編輯 go.mod
go mod graph    //  打印 modules 依賴圖
go mod verify   //  驗證依賴
go mod why      //  解釋依賴使用

使用案例:

// golang 建立新項目時,要注意在終端上使用以下命令建立go.mod文件。否則 go get,以及引用自己項目包文件時會出錯。
go mod init projectName

3、import用法

golang 使用包 package 來管理定義模塊,可以使用 import 關鍵字來導入使用。

(1)Go Module的import:

導入go自帶的包/go get安裝的包:import "包名",Go Module會自動找到相應的包。
若是go get的包,會自動復制到vendor文件夾內,然后自動去vendor底下找。
導入自定義包:import "項目名/pacakge名"


相對路徑 import "./model" //當前文件同一目錄的model目錄,但是不建議這種方式import
絕對路徑 import "shorturl/model" //加載GOPATH/src/shorturl/model模塊

參考:https://blog.csdn.net/zhangzhebjut/article/details/25564457

(2)歷史版本的import:

如果導入的是 go 自帶的包,則會去安裝目錄 $GOROOT/src 按包路徑加載,如 fmt 包
如果是我們 go get 安裝或自定義的包,則會去 $GOPATH/src 下加載

4、package用法

package是最基本的分發單位和工程管理中依賴關系的體現;

  1. 每個GO語言源代碼文件開頭都擁有一個package聲明,表示源碼文件所屬代碼包;
// golang包名必須與所在文件夾同名嗎?
不必須,但是同個目錄中(不含子目錄)的所有文件包名必須一致,通常為了方便包定位,建議包名和目錄名一致,否則你import"A",使用起來B.xxx,看上去不統一,不能一眼看出來這個B包是哪個文件的。
  1. 要生成GO語言可執行程序,必須要有main的package包,且必須包含main()函數;
  2. 同一個路徑下只能存在一個package,一個package可以拆成多個源文件組成;(同一個目錄下文件只能有一個包名,一個目錄下可以有多個文件)

參考:https://blog.csdn.net/qq_37189082/article/details/100041835

四、Gin框架

1、Gin介紹

(1)資源

Gin是一個用Go語言編寫的web框,Go最流行的Web框架。使用了httprouter,高性能和高效。

官方中文文檔:https://gin-gonic.com/zh-cn/docs/introduction/
GitHub地址:https://github.com/gin-gonic/gin
獲取參數的案例:https://www.cnblogs.com/jiujuan/p/9388507.html【比官方簡單清晰,用到再說】
主要參考https://www.cnblogs.com/linqiaobao/p/14206494.html【下面整理參考,未完待續】

(2)RESTful API

Gin框架支持開發RESTful API的開發。
參考:http://www.ruanyifeng.com/blog/2011/09/restful.html
RESTful架構,就是目前最流行的一種互聯網軟件架構。如果一個架構符合REST原則,就稱它為RESTful架構。
Fielding將他對互聯網軟件的架構原則,定名為REST,即Representational State Transfer,表現層狀態轉化
對每個詞理解:資源(主語Resourse)的表現層(Representational)狀態轉化(State Transfer)。

(2-1)Resource

資源是網絡上的一個實體,可以是圖片、文本、歌曲、服務……。訪問資源用的是,資源位置的唯一標識URI。

(2-2)Representation

表現,即表示格式。我們把"資源"具體呈現出來的形式,叫做它的"表現層"(Representation)。
如,文本可以用txt格式表現,也可以用HTML格式、XML格式、JSON格式表現,甚至可以采用二進制格式;圖片可以用JPG格式表現,也可以用PNG格式表現。

  1. URI只代表資源的實體,不代表它的形式。嚴格地說,有些網址最后的".html"后綴名是不必要的,因為這個后綴名表示格式,屬於"表現層"范疇,而URI應該只代表"資源"的位置

  2. 它的具體表現形式,應該在HTTP請求的頭信息中用Accept和Content-Type字段指定,這兩個字段才是對"表現層"的描述。

    Accept : 客戶端希望接受的數據類型,比如 Accept:text/xml(application/json)表示希望接受到的是xml(json)類型 Content-Type:發送端發送的實體數據的數據類型。
    一個HTTP請求報文由請求行(request line)、請求頭部(header)、空行請求數據4個部分組成。
    <request-line> //請求行
    <headers> //首部行
    <blank line> //空行
    <request-body> //請求體
    HTTP相關,更多參考:https://www.cnblogs.com/myseries/p/11239662.html
  3. http協議(三)幾種數據傳輸方式

(2-3)State Transfer
  1. 狀態:訪問一個網站,就代表了客戶端和服務器的一個互動過程。在這個過程中,勢必涉及到數據和狀態的變化。
  2. HTTP協議,是一個無狀態協議。只管請求+響應,一錘子買賣。這意味着,所有狀態都保存在服務器端
隨着web的不斷發展,有時候,需要將這種狀態進行保持,隨即,就引入了cookie技術,cookie技術通過在請求和響應報文中寫入cookie信息來控制客戶端的狀態。
  1. 客戶端用到的手段,只能是HTTP協議。具體來說,就是HTTP協議里面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。
(2-4)總結

REST三原則:

  • 每一個URI代表一種資源;
  • 客戶端和服務器之間,傳遞這種資源的某種表現層;
  • 客戶端通過四個HTTP動詞,對服務器端資源進行操作,實現"表現層狀態轉化"。

簡單來說,REST的含義就是客戶端與Web服務器之間進行交互的時候,使用HTTP協議中的4個請求方法代表不同的動作。

  • GET用來獲取資源
  • POST用來新建資源
  • PUT用來更新資源
  • DELETE用來刪除資源。

例子
例如,我們現在要編寫一個管理書籍的系統,我們可以查詢對一本書進行查詢、創建、更新和刪除等操作,我們在編寫程序的時候就要設計客戶端瀏覽器與我們Web服務端交互的方式和路徑。按照經驗我們通常會設計成如下模式:【URL不同,請求方式不限。

請求方法 URL 含義
GET /book 查詢書籍信息
POST /create_book 創建書籍記錄
POST /update_book 更新書籍信息
POST /delete_book 刪除書籍信息

同樣的需求我們按照RESTful API設計如下:【URL相同,請求方法不同!

請求方法 URL 含義
GET /book 查詢書籍信息,對應數據庫的Read
POST /book 創建書籍記錄,對應數據庫的Update
PUT /book 更新書籍信息,對應數據庫的Create
DELETE /book 刪除書籍信息,對應數據庫的Delete

2、Gin安裝和使用

(1)Gin安裝

由於配置了mod,只需引入包即可,然后執行vendor命令。如果報紅參考這里

// 引入gin包
import "github.com/gin-gonic/gin"
// 報紅執行命令
go mod init 項目名
go mod vendor
go mod tidy

(2)第一個Gin案例

package main

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

func main() {
	// 創建一個默認的路由引擎
	r := gin.Default()
	// GET:請求方式;/hello:請求的路徑
	// 當客戶端以GET方法請求/hello路徑時,會執行后面的匿名函數
	r.GET("/hello", func(c *gin.Context) {
		// c.JSON:返回JSON格式的數據
		c.JSON(200, gin.H{
			"message": "Hello world!",
		})
	})
	// 啟動HTTP服務,默認在0.0.0.0:8080啟動服務
	r.Run()
}

瀏覽器打開127.0.0.1:8080/hello

3、Gin連接mysql

參考:https://www.cnblogs.com/finnlee/p/14269591.html

import (
	"database/sql"
	"fmt"
	"log"

	"github.com/gin-gonic/gin"
	_ "github.com/go-sql-driver/mysql"
)

如果報紅找不到導入包,則可以多執行幾次go mod vendorgo mod tidy,還是不行,關掉項目重新打開試試。
注意,文件不要以*_test.go結尾,無法編譯運行

4、Gin渲染

五、Postman進行測試

開發RESTful API的時候我們通常使用Postman來作為客戶端的測試工具。

1、安裝

下載:postman官網

不想注冊:關掉重啟就行,或者File-New Postman Window

2、使用

教程:https://blog.csdn.net/fxbin123/article/details/80428216

新建請求:File-New Tab,按教程設置參數。

請求中用到(IP時?)localhost或127.0.0.1

存儲請求:一個項目一個Collections,下面還可以按照文件夾分類,保存請求。創建Collections。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM