一、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、步驟
-
新建文件夾demo1,作為項目根目錄
-
cmd,執行命令:go mod init demo1
-
vscode打開文件:File-Open Folder,選擇項目根目錄demo1
-
新建main.go文件:File-New File,在根目錄下創建main.go文件
package main // 可執行文件,package必須是main import ( "demo1/test" ) func main(){ test.F1() }
-
創建test包和F1函數:創建文件夾demo1/test,創建文件test1.go,內容如下。
package test // 可以不與文件夾同名,但最好同名 import ( "fmt" ) func F1(){ // 大寫開頭表示公有,小寫開頭表示私有 fmt.Println("Hello World!") }
-
執行: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是最基本的分發單位和工程管理中依賴關系的體現;
- 每個GO語言源代碼文件開頭都擁有一個package聲明,表示源碼文件所屬代碼包;
// golang包名必須與所在文件夾同名嗎?
不必須,但是同個目錄中(不含子目錄)的所有文件包名必須一致,通常為了方便包定位,建議包名和目錄名一致,否則你import"A",使用起來B.xxx,看上去不統一,不能一眼看出來這個B包是哪個文件的。
- 要生成GO語言可執行程序,必須要有main的package包,且必須包含main()函數;
- 同一個路徑下只能存在一個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格式表現。
-
URI只代表資源的實體,不代表它的形式。嚴格地說,有些網址最后的".html"后綴名是不必要的,因為這個后綴名表示格式,屬於"表現層"范疇,而URI應該只代表"資源"的位置。
-
它的具體表現形式,應該在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
(2-3)State Transfer
- 狀態:訪問一個網站,就代表了客戶端和服務器的一個互動過程。在這個過程中,勢必涉及到數據和狀態的變化。
- HTTP協議,是一個無狀態協議。只管請求+響應,一錘子買賣。這意味着,所有狀態都保存在服務器端。
隨着web的不斷發展,有時候,需要將這種狀態進行保持,隨即,就引入了cookie技術,cookie技術通過在請求和響應報文中寫入cookie信息來控制客戶端的狀態。
- 客戶端用到的手段,只能是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 vendor
和go 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。