一.创建项目文件夹&项目初始化
mkdir go-example
cd go-example
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
-
mkdir go-example && cd go-example
创建项目文件夹并进入 -
go env -w GO111MODULE=on
设置go的环境变量GO111MODULE=on,打开 Go modules 开关 -
go env -w GOPROXY=https://goproxy.cn,direct
设置 GOPROXY 代理, https://goproxy.cn,国内的 Go 模块代理;direct,用于指示 Go 在拉取模块时遇到错误会回源到模块版本的源地址去抓取(比如 GitHub 等)。 -
go mod init go-example
初始化 Go modules,它将会生成 《go.mod》 文件,go-example是modules的引入路径。
《go.mod》:
module go-example
go 1.15
二.拉取gin
$ go get -u github.com/gin-gonic/gin
go: github.com/gin-gonic/gin upgrade => v1.6.3
go: gopkg.in/yaml.v2 upgrade => v2.4.0
go: github.com/golang/protobuf upgrade => v1.4.3
go: golang.org/x/sys upgrade => v0.0.0-20210113131315-ba0562f347e0
go: github.com/leodido/go-urn upgrade => v1.2.1
go: github.com/modern-go/reflect2 upgrade => v1.0.1
go: github.com/ugorji/go/codec upgrade => v1.2.3
go: github.com/modern-go/concurrent upgrade => v0.0.0-20180306012644-bacd9c7ef1dd
go: github.com/json-iterator/go upgrade => v1.1.10
go: github.com/go-playground/validator/v10 upgrade => v10.4.1
go: downloading golang.org/x/sys v0.0.0-20210113131315-ba0562f347e0
go: downloading github.com/ugorji/go v1.2.3
go: downloading github.com/ugorji/go/codec v1.2.3
go: google.golang.org/protobuf upgrade => v1.25.0
go: golang.org/x/crypto upgrade => v0.0.0-20201221181555-eec23a3978ad
完成后项目下多了个新文件《go.sum》,文件详细罗列了当前项目直接或间接依赖的所有模块版本,并写明了那些模块版本的 SHA-256 哈希值以备 Go 在今后的操作中保证项目所依赖的那些模块版本不会被篡改。
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
...
《go.mod》文件也相应的发生了变化
module go-example
go 1.15
require (
github.com/gin-gonic/gin v1.6.3 // indirect
github.com/go-playground/validator/v10 v10.4.1 // indirect
github.com/golang/protobuf v1.4.3 // indirect
github.com/json-iterator/go v1.1.10 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/ugorji/go v1.2.3 // indirect
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect
golang.org/x/sys v0.0.0-20210113131315-ba0562f347e0 // indirect
google.golang.org/protobuf v1.25.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)
《go.mod》 文件是启用了 Go modules 的项目所必须的最重要的文件,描述了当前项目的元信息,每一行都以一个动词开头,目前有以下 5 个动词:
- module:用于定义当前项目的模块路径。
- go:用于设置预期的 Go 版本。
- require:用于设置一个特定的模块版本。
- exclude:用于从使用中排除一个特定的模块版本。
- replace:用于将一个模块版本替换为另外一个模块版本。
indirect 的意思是传递依赖,也就是非直接依赖。
三.启动web服务
- 编写一个hello.go文件
package main
import "github.com/gin-gonic/gin"
func main() {
r:= gin.Default()
r.GET("/hello", func(c *gin.Context) {
c.JSON(200,gin.H{"msg":"Hello Go"})
})
r.Run()
}
- 启动
go run hello.go
$ go run hello.go
[GIN-debug] GET /hello --> main.main.func1 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
用浏览器访问
http://127.0.0.1:8080/hello
至此一个简单的gin web服务器就搭建完成了
《go.mod》里的 github.com/gin-gonic/gin默认是indirect模式,而实际上是直接引用的,在应用根目录下执行$ go mod tidy
命令,整理现有依赖,整理完成后面的//indirect就没有了。
require (
github.com/gin-gonic/gin v1.6.3
github.com/go-playground/validator/v10 v10.4.1 // indirect
...