go语言基础知识-GOROOT、GOPATH、go install、go build、go mod

对golang工作空间、GOROOT、GOPATH以及常见的go命令(go build、go install、go mod)进行说明,作为初学golang所需要掌握的基础知识

文章目录

    • 工作空间
    • 环境变量
    • go build与go install
    • go mod
      • 具体使用
    • 参考

工作空间

golang的工作空间是存放代码的地方,它的目录结构遵循存放代码的一些规则和使得代码正确工作需要进行的一些配置,一般无需手动配置。

  • src:存放源码的位置
  • pkg:源码被组织成包存放的位置
  • bin:包含可执行的命令,一般是通过go install安装的命令

环境变量

  • GOROOT:这是安装go语言到指定位置时需要设置的环境变量,是安装go所在的位置。
  • GOPATH:这是指定工作空间所在的位置。
  • GOPROXY:对一些第三方包如果因为网络原因无法下载或下载较慢,可以使用该环境变量中设置的代理服务器进行下载,国内常用https://goproxy.cn

go build与go install

两者的作用似乎有所重叠,以我目前的理解来看,两者都会对某个指定目录下的go代码进行编译,而go install则会多一步将编译完成的文件安装在$GOPATH/bin目录下。

需要进行说明的是,在我开始学习golang时,我所参考的教程直接通过在某个目录下运行go build或者go install,在我跟着运行的时候则会报错:

报错

这个是因为该教程所使用的go版本与我使用的不同导致的,现在的go新增了go module这一项功能,所以直接使用 go build就会出现以上的错误。可以选择在命令后面添加具体的.go文件或者配置go mod对与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语言基础知识-GOROOT、GOPATH、go install、go build、go mod_第1张图片

该命令创建go.mod后会根据.go文件的内容自动生成合适的配置

go.mod的内容主要通过四项:

  • module 指定包的名字,一般建议与所在目录名相同
  • require 创建时会自动添加一些内容,指定.go文件依赖的包
  • replacerequire中的依赖包进行替换
  • excluderequire中的依赖包进行忽略

一般来说,在对应目录直接运行go mod init后就可以运行go build或者go install了,无法找到对应的包再根据需要修改go.mod文件即可,结果如下:

在这里插入图片描述

  • go mod tidy:完成go.mod文件的创建后,如果代码文件中依赖有所改变,可以运行该命令,更新go.mod文件,会添加缺少的包并去掉为试用的包

参考

  • 19. 一文搞懂 Go Modules 前世今生及入门使用 - 王一白 - 博客园 (cnblogs.com)(这篇文章写的很好)

你可能感兴趣的:(笔记,golang,经验分享)