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 内容,不会被恶意或意外篡改。
显示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,但这样比较不方便;