0、golang 安装
- 官网地址
https://golang.google.cn/dl/
1、go两种构建模式
go语言发展至今因为包依赖的问题有两种的构建模式:经典的gopath mode和目前的go module标准mode。
1.1 gopath 【经典传统,逐渐淘汰】
1.1.1 gopath说明
GOPATH下一般会有三个文件夹src、pkg、bin。
- src存放项目源码文件(.go结尾)
- 对于src目录,存放源文件,Go中源文件以包(package)的形式组织。通常的,新建一个包就在src目录中新建一个文件夹
- bin存放编译后的可执行文件(二进制或exe文件)
- pkg存放编译后的包文件(.a结尾)
- pkg中的文件是Go编译生成的,并非手动放进去的。(一般文件后缀.a)
注意:一般,bin和pkg目录可以不创建,go命令会自动创建(如 go install),只需要创建src目录即可。
1.1.2 gopath不足
缺点:
- 这种方式是只有一个GOPATH然后在src文件下创建不同的项目,但是但是这样的话每个项目所需要的依赖也就都放在同一个地方,如下:
这种对于coding还是不方便,所以就有了另一种方式:go module 模式!!【推荐】
1.2 go module 【目前主流推荐】
在go module下,由于go module启用后彻底与GOPATH“解绑”,无需将proj1、proj2和proj3放置在同一个目录下,放在任意目录下均可。
就目前而言,对于新项目,强烈建议默认启用go module。并且彻底放弃gopath mode。
1.2.1 goproxy.io代理
- https://goproxy.io/zh/docs/getting-started.html
goland 配置代理及 支持go mod模式
1.2.2 mod 基本概念
1)go.mod 文件
go.mod 文件为项目启动的核心文件,描述了当前项目的依赖包信息。
- module:用于定义当前项目的模块路径
- go:用于设置预期的Go版本
- require:用于需求一个特定的模块版本
- exclude:用于从使用中排除一个特定的模块版本
- replace:用于将一个模块版本替换为另一个模块版本
2)go.sum 文件
go.sum文件类似于Gopkg.lock的一类文件,罗列了当前项目直接或间接依赖的所有模块版本
1.2.3 go mod 常用命令
用 go help module-get 和 go help gopath-get 分别去了解 Go modules 启用和未启用两种状态下的 go get 的行为
用 go get 拉取新的依赖
go get golang.org/x/text@latest # 拉取最新的版本(优先择取 tag)
go get golang.org/x/text@master # 拉取 master 分支的最新 commit
go get golang.org/x/text@v0.3.2 # 拉取 tag 为 v0.3.2 的 commit
go get golang.org/x/text@342b2e1 # 拉取 hash 为 342b231 的 commit,最终会被转换为 v0.3.2
用 go get -u # 更新现有的依赖
用 go mod download 下载 go.mod 文件中指明的所有依赖
用 go mod tidy 整理现有的依赖
用 go mod graph 查看现有的依赖 结构
用 go mod init 生成 go.mod 文件(Go 1.13 中唯一一个可以生成 go.mod 文件的子命令)
用 go mod edit 编辑 go.mod 文件
用 go mod vendor 导出现有的所有依赖(事实上 Go modules 正在淡化 Vendor 的概念)
用 go mod verify 校验一个模块是否被篡改过
2、 go mod 一个新项目
2.1 设置代理
win:cmd;linux:terminal
- win
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
- linux、mac
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
因为它的默认值被墙了
2.2 开始 hello 项目
-
创建 项目 hello 目录
-
go mod init 项目:初始化项目,生成 go.mod文件
go mod init hello
go.mod 提供了go、module, require、replace和exclude 五个命令
- module:用于定义当前项目的模块路径
- go:用于设置预期的Go版本
- require:用于需求一个特定的模块版本
- exclude:用于从使用中排除一个特定的模块版本
- replace:用于将一个模块版本替换为另一个模块版本
- 在项目hello目录下新建 server.go 文件,代码如下:
package main
import (
"net/http"
"github.com/labstack/echo"
)
func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "hello, world!!")
})
e.Logger.Fatal(e.Start(":8001"))
}
- 配置 git ,注意:win 系统变量 需要调整 git 的 bin目录下,不然 go mod 依赖 报错!!
git下载地址:https://git-scm.com/downloads
D:\Program files\Git\bin
设置 git ssl
git config --global http.sslVerify "false"
- 配置 国内代理,才能下载到依赖
- win
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
- linux、mac
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
- Goland
https://goproxy.cn,direct
- 在项目的go.mod文件目录下,执行go mod 相关命令下载依赖包 ,可参考上述 go mod 命令
go mod tidy
- 可以看到 依赖包 已经变绿色~
- 同时 go.mod 文件内容也自动更新
module hello
go 1.16
require (
github.com/labstack/echo v3.3.10+incompatible
github.com/labstack/gommon v0.3.0 // indirect
github.com/stretchr/testify v1.7.0 // indirect
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a // indirect
)
- 运行 调测 server.go
go run server.go
可以发现 程序已经正常运行监听
参考:
- https://github.com/golang/go/wiki/Modules
- https://juejin.cn/post/6844903798658301960