Go官网下载地址:https://golang.org/dl/
https://go.dev/dl/
Go官方镜像站(推荐):https://golang.google.cn/dl/
以Linux版本为例:
下载后,上传到Linux服务器中,解压到/usr/local
路径中:
sudo tar -zxvf go1.21.5.linux-amd64.tar.gz -C /usr/local/
进入/usr/local
路径,有一个go
文件夹:
进入该文件夹
其中src目录下是go的源码
进入bin目录
有两个指令,go
是go语言的编译环境,我们需要将当前路径配置到系统环境变量中;
配置环境变量:
回到家目录下,打开默认配置文件:
加入以下环境变量:
export GOROOT="/usr/local/go" export GOPATH=$HOME/go export GOBIN=$GOROOT/bin export PATH=$PATH:$GOBIN
GOROOT:go语言的源码包所在的路径;
GOPATH:go语言的工作路径,可以自定义;
GOBIN:go语言源码编译环境路径;
PATH:配置系统环境变量;
配置完后,保存并加载一下:
检查版本,验证环境配置是否成功:
go --help
指令能够查看当前有哪些指令可以使用:
配置GOPATH:
gopath就是go项目代码存放的位置,可以自定义,该目录下有三个子目录:src,pkg, bin;
GOPROXY
Go1.14版本之后,都推荐使用go mod模式来管理依赖了,也不再强制我们把代码必须写在GOPATH下面的src目录了,你可以在你电脑的任意位置编写go代码。
默认GoPROXY配置是:GOPROXY=https://proxy.golang.org,direct
,
由于国内访问不到 https://proxy.golang.org 所以我们需要换一个PROXY,这里推荐使用https://goproxy.io
或 https://goproxy.cn
。
可以执行下面的命令修改GOPROXY
:
go env -w GOPROXY=https://goproxy.cn,direct
Go 1.11 版本推出modules
机制,简称 mod,更加易于管理项目中所需要的模块。模块是存储在文件树中的 Go 包的集合,其根目录中包含 go.mod
文件。 go.mod
文件定义了模块的模块路径,它也是用于根目录的导入路径,以及它的依赖性要求。每个依赖性要求都被写为模块路径和特定语义版本。
从 Go 1.11 开始,Go 允许在$GOPATH/src
的任何目录下使用 go.mod 创建项目。在 $GOPATH/src 中,为了兼容性,Go 命令仍然在旧的 GOPATH 模式下运行。从 Go 1.13 开始,go.mod模式将成为默认模式。
Go Modules 在 Go 1.11 及 Go 1.12 中有三个模式,根据环境变量 GO111MODULE 定义:
默认模式(未设置该环境变量或 GO111MODULE=auto)
GOPATH 模式(GO111MODULE=off)
Go 命令行工具从不使用 Go Modules。相反,它查找 vendor 目录和 GOPATH 以查找依赖项。
Go Modules 模式( GO111MODULE=on)
Go 命令行工具只使用 Go Modules,GOPATH不再作为导入目录,但它还是会把下载的依赖储存在 GOPATH/pkg/mod 中,也会把 goinstall的结果放在 GOPATH/bin 中,只移除了 GOPATH/src/。
如果 GO111MODULE 没有显式设置,那么默认为 on。如果 go env 查出来的环境变量 GO111MODULE 为空,那么 go 编译器默认 GO111module 为 on。
Go modules 的使用:
# 临时开启 Go modules 功能
export GO111MODULE=on
# 永久开启 Go modules 功能
go env -w GO111MODULE=on
# 设置 Go 的国内代理,方便下载第三方包
go env -w GOPROXY=https://goproxy.cn,direct
如果设置失败,可以直接修改~/.bashrc
配置文件:
逗号后面可以增加多个 proxy,最后的 direct 则是在所有 proxy 都找不到的时候,直接访问,代理访问不到的私有仓库就可以正常使用了。
其它代理请参考:
https://www.cnblogs.com/feiquan/p/13357971.html
https://studygolang.com/articles/23599?fr=sidebar
最后通过env查看:
目前go开发的主流IDE有GoLand和VS Code,下面以VS Code为例,实现go的开发环境配置;
sudo go env -w GOPROXY=https://goproxy.cn,direct
sudo go env -w GO111MODULE=on
我们使用了go mod模块,就可以在$GOPATH
以外的目录创建项目,然后初始化 go mod init project_name
,成功之后会发现目录下会生成一个 go.mod
文件。
查看内容
go.mod
文件只存在于模块的根目录中。模块子目录的代码包的导入路径等于模块根目录的导入路径(就是前面说的 module path)加上子目录的相对路径。
?
比如,我们如果创建了一个子目录叫 common
,我们不需要(也不会想要)在子目录里面再运行一次 go mod init
了,这个代码包会被认为就是 go_test
模块的一部分,而这个代码包的导入路径就是 go_test/common
。
在 go_test 文件夹下创建main.go
并添加以下内容
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
执行 go build main.go
之后会自动下载三方包到默认的目录 $GOPATH/pkg/mod
,也就是 Mod Cache
路径;
进入$GOPATH/pkg/mod
目录查看
查看go.mod文件和go.sum文件:
module
表示模块名称require
依赖包列表以及版本exclude
禁止依赖包列表,不下载和引用哪些包(仅在当前模块为主模块时生效)replace
替换依赖包列表和引用路径(仅在当前模块为主模块时生效)replace golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5
replace (
golang.org/x/net => github.com/golang/net latest
golang.org/x/tools => github.com/golang/tools latest
golang.org/x/crypto => github.com/golang/crypto latest
golang.org/x/sys => github.com/golang/sys latest
golang.org/x/text => github.com/golang/text latest
golang.org/x/sync => github.com/golang/sync latest
)
indirect
表示这个库是间接引用进来的。
使用 go list -m all
可以查看到所有依赖列表,也可以使用 go list -json -m all
输出 json格式的打印结果。
除了 go.mod 之外,go 命令行工具还维护了一个 go.sum 文件,它包含了指定的模块的版本内容的哈希值作为校验参考:
go 命令行工具使用 go.sum 文件来确保你的项目依赖的模块不会发生变化——无论是恶意的,还是意外的,或者是其它的什么原因。go.mod 文件和 go.sum 文件都应该保存到你的代码版本控制系统里面去。
go.sum 这个文件记录了源码的直接依赖和间接依赖包的相关版本的 hash 值,用来校验本地包的真实性。在构建的时候,如果本地依赖包的 hash 值与 go.sum 文件中记录的不一致,就会被拒绝构建,这样可以确保你的项目所依赖的 module 内容,不会被恶意或意外篡改。
go build main.go
go run main.go
显示gopls was not able to find modules in your workspace
,这种报错的原因是,使用VS Code打开的远程目录当做workspace,但是由于go mod
机制,源码不在$GOPATH
中,需要使用go mod init
来初始化项目,而初始化形成的go.mod
文件不在workspace目录下,而在其子目录下,导致gopls
寻找modules错误;
解决方案是使用go work
机制,即多模块工作区机制(要把哪些mod纳入到你的工作区内);
vscode打开的文件夹的路径默认作为了其工作区(workspace),而这个工作区的根目录要有go.mod
文件,如果根目录没有这个go.mod
就要指定哪些子目录的go mod
纳入工作区
go work init
go work use 需要纳入工作区的子目录
这样gopls
就不会报错了;
也可以选择VS Code直接打开项目目录作为workspace,但这样比较不方便;