前面一直都是在单个的go文件中进行编译运行,昨天学习了go module之后,发现还需要配置一些别的东西,比如goproxy等。在此记录一下完整的go项目创建过程。
前置准备:
- 安装vscode
安装Go
下载链接:go.dev,我直接在这个网站中下载了最新的go(go1.23.2.windows-amd64.msi),是一个msi文件,下载后直接点击运行默认安装即可。
Go的环境变量
这里主要配置了两个环境变量:GOROOT和GOPATH。
下载安装完go后GOROOT已经被自动加入到系统变量中。
- 运行
cmd,输入go env:
我把需要关注的几个变量用红色边框圈出,留有印象。现在只需要关注
GOROOT和GOPATH的路径,并把它们加入到系统变量中:
然后再把它们加入到系统变量的
path中:
安装vscode插件
go语言要在vscode上运行需要安装go插件和code runner插件
创建go项目
go使用go module来进行依赖管理。
首先创建一个文件夹作为项目文件夹,我这里创建了一个test项目。进入到该目录下的终端,输入go mod init test。发现生成了一个go.mod文件,这个文件就是module用来管理依赖的文件。
module test
go 1.23.2
接下来我们创建一个hello.go:
package main
import "fmt"
func main() {
fmt.Println("hello")
}
运行成功,这里的fmt是go自带的原生库。如果我们想要使用第三方库应该怎么办呢?
rsc.io/quote库提供了一个收集名言警句的包。在代码中引入:
package main
import "fmt"
import "rsc.io/quote"
func main() {
fmt.Println(quote.Go())
}
点击运行,发现报错:
hello.go:5:8: no required module provides package rsc.io/quote; to add it:
go get rsc.io/quote
原来我们还没有成功的引入该module,建议我们使用go get来获取。但是在这里我使用的是go mod tidy,他们的区别在于go mod tidy还能够清除不需要的依赖,避免依赖过于臃肿。
运行 go mod tidy,依然报错:
go: test imports
rsc.io/quote: module rsc.io/quote: Get "https://proxy.golang.org/rsc.io/quote/@v/list": dial tcp 142.251.33.81:443: connectex: A connection attempt dial tcp 142.251.33.81:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
原来前面看到的GOPROXY变量的作用就在于此,它指定了第三方库的来源,由于网络原因,我们需要把它配置为国内镜像源。运行go env -w GOPROXY=https://goproxy.cn(还有一些其他的镜像源,可以自行尝试)
再次尝试go mod tidy,发现依赖已经成功安装.
>go mod tidy
go: finding module for package rsc.io/quote
go: downloading rsc.io/quote v1.5.2
go: found rsc.io/quote in rsc.io/quote v1.5.2
go: downloading rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
成功运行hello程序。给我输出了一个名言:Don't communicate by sharing memory, share memory by communicating.嗯~确实很有道理,当目的不纯粹,交流也变得吃力。 我们还发现go.mod已经悄悄地发生了变化:
module test
go 1.23.2
require rsc.io/quote v1.5.2
require (
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect
rsc.io/sampler v1.3.0 // indirect
)
在go.mod中已经自动引入了我们需要的依赖。inderect表示间接依赖。还多了一个go.sum文件,以下为go.sum的介绍:
为了确保一致性构建,Go引入了go.mod文件来标记每个依赖包的版本,在构建过程中go命令会下载go.mod中的依赖包,下载的依赖包会缓存在本地,以便下次构建。 考虑到下载的依赖包有可能是被黑客恶意篡改的,以及缓存在本地的依赖包也有被篡改的可能,单单一个go.mod文件并不能保证一致性构建。
为了解决Go module的这一安全隐患,Go开发团队在引入go.mod的同时也引入了go.sum文件,用于记录每个依赖包的哈希值,在构建时,如果本地的依赖包hash值与go.sum文件中记录得不一致,则会拒绝构建。
为了以后导入包更方便,可以把GOPROXY变量也在系统变量中进行配置。
经过这次创建项目的经历,我对go的依赖管理方式有了更深的认识,发现Go Modules相比旧的
GOPATH和govendor提供了更好的依赖管理和版本控制。Go Modules锁定依赖的确切版本,这有助于避免在不同环境中出现不一致的问题。