一、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。
作者:西伯尔
出处:http://www.cnblogs.com/sybil-hxl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。