赞
踩
对golang工作空间、GOROOT、GOPATH以及常见的go命令(go build、go install、go mod)进行说明,作为初学golang所需要掌握的基础知识
golang的工作空间是存放代码的地方,它的目录结构遵循存放代码的一些规则和使得代码正确工作需要进行的一些配置,一般无需手动配置。
src
:存放源码的位置pkg
:源码被组织成包存放的位置bin
:包含可执行的命令,一般是通过go install安装的命令GOROOT
:这是安装go语言到指定位置时需要设置的环境变量,是安装go所在的位置。GOPATH
:这是指定工作空间所在的位置。GOPROXY
:对一些第三方包如果因为网络原因无法下载或下载较慢,可以使用该环境变量中设置的代理服务器进行下载,国内常用https://goproxy.cn
两者的作用似乎有所重叠,以我目前的理解来看,两者都会对某个指定目录下的go代码进行编译,而go install则会多一步将编译完成的文件安装在$GOPATH/bin
目录下。
需要进行说明的是,在我开始学习golang时,我所参考的教程直接通过在某个目录下运行go build
或者go install
,在我跟着运行的时候则会报错:
这个是因为该教程所使用的go版本与我使用的不同导致的,现在的go新增了go module
这一项功能,所以直接使用 go build
就会出现以上的错误。可以选择在命令后面添加具体的.go
文件或者配置go mod
对与go mod
将在下面进行说明。
go mod的特性实在1.11版本中提出的,在1.16版本中默认开启了这项功能,主要有两个功能:
- 使得不必要将当前的代码设置在$GOPATH/src目录下就能完成编译
- 使得golang对第三方的包管理更为合适
对第一个功能的解释:默认不打开
go mod
功能时,所有的代码都需要在$GOPATH/src
目录下才能完成编译与安装,而引入了go mod
功能之后,只需要当前代码是某个存在go.mod的目录或者该目录下级目录,就可以进行编译。对第二个功能的解释:在
go mod
出现之前,golang使用的包管理的逻辑是直接将包安装在$GOPATH/src
目录下,这样不利用对多个包的版本的统一管理,还会导致第三方的包和自定义的包的混用,而vender出现之后,虽然勉强解决了这个问题,但是又存在着每写一份代码,都需要下载一套使用到的包的对应版本,增加了磁盘的占用量,降低了代码的利用率。而go mod
则是将各个版本的包下载到指定目录,同时记录版本信息,方便了统一管理。对于
go mod
更详细的解释可以参考文章最后的链接
go mod init
: 创建go.mod文件,该命令可以加上模块名作为参数:该命令创建go.mod
后会根据.go
文件的内容自动生成合适的配置
go.mod
的内容主要通过四项:
module
指定包的名字,一般建议与所在目录名相同require
创建时会自动添加一些内容,指定.go
文件依赖的包replace
对require
中的依赖包进行替换exclude
对require
中的依赖包进行忽略一般来说,在对应目录直接运行go mod init
后就可以运行go build
或者go install
了,无法找到对应的包再根据需要修改go.mod
文件即可,结果如下:
go mod tidy
:完成go.mod
文件的创建后,如果代码文件中依赖有所改变,可以运行该命令,更新go.mod
文件,会添加缺少的包并去掉为试用的包Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。