GO语言基础篇(一) - GO环境变量详解

4,008 阅读10分钟

这是我参与8月更文挑战的第 1 天,活动详情查看: 8月更文挑战

环境搭建

首先去go官网下载go的安装包,根据自己的操作系统,选择相应的安装包下载

说明:本文以macOS为例来安装go环境

下载完安装包后,双击安装包,傻瓜式安装即可,macOS的go默认安装路径为:

macOS的go默认安装路径:/usr/local/go

Windows的go默认安装路径:C:/go

安装完成之后,配置GO环境变量。编辑.bash_profile文件,在该文件下增加以下内容(根据自己的实际情况进行配置)

1、打开.bash_profile文件
vim ~/.bash_profile

2、在配置文件中增加以下内容(编辑完之后保存并退出)
#Seeting path for Golang(这一行是注释)
export GOROOT=/usr/local/go #go的安装路径
export PATH=$GOROOT/bin:$PATH
export GOPATH=/Users/shulv/studySpace/GolangProject #我们的工作区。后边会详细介绍
export GOBIN=/Users/shulv/studySpace/GolangProject/bin#这里存放的是源代码编译后生成的可执行文件

3、使刚才编辑的.bash_profile立刻生效。执行
source ~/.bash_profile

执行以下命令来验证是否安装成功

1、查看版本信息
go version

2、查看Go默认环境变量
go env

如果看到正确的打印结果,说明环境安装成功

环境变量介绍

1、查看全部的go环境变量
go env

2、查看指定的go环境变量
go env 环境变量名称(如:go env GOROOT 查看go的安装目录)

下边是我本机的go环境变量

GO111MODULE=""
GOARCH="amd64"
GOBIN="/Users/shulv/studySpace/GolangProject/bin"
GOCACHE="/Users/shulv/Library/Caches/go-build"
GOENV="/Users/shulv/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/shulv/studySpace/GolangProject/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/shulv/studySpace/GolangProject"
GOPRIVATE=""
GOPROXY="<https://proxy.golang.org>,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GOVCS=""
GOVERSION="go1.16.6"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/v2/8n4xnrln7l34q18v_2dt6tdr0000gn/T/go-build1451458835=/tmp/go-build -gno-record-gcc-switches -fno-common"

go中可设置的环境变量虽然有很多,但是很多我们可能都用不到,了解以下几个就差不多了

GOROOT
GOPATH
GOBIN
GOOS
GOARCH
GOPROXY
GO111MODULE

GOROOT

GOROOT是go语言的安装目录,它的作用就是用来索引go安装目录下的资源,比如go安装目录下的bin目录中包含go提供的工具,如一些常用的go命令。上边在介绍go环境安装的时候,配置环境变量GOBIN的时候,该环境变量的值就是GOROOT/bin,也就是GO安装目录下边的bin目录。并将该路径拼接到了GOROOT/bin,也就是GO安装目录下边的bin目录。并将该路径拼接到了PATH中,这样就可以全局使用go提供的一些命令

go安装目录下的目录结构(MacOS的go默认安装路径为:/usr/local/go)

AUTHORS          官方 Go语言作者列表
CONTRIBUTING.md
CONTRIBUTORS     第三方的贡献者
LICENSE          Go语言发布授权协议
PATENTS          专利
README.md
SECURITY.md
VERSION
api             存放Go API检查器的辅助文件
bin             存放所有由官方提供的Go语言相关工具的可执行文件。默认情况下,该目录会包含go和gofmt这两个工具
doc             存放Go语言几乎全部的HTML格式的官方文档和说明,方便开发者在离线时查看
favicon.ico
lib             文档模版
misc            存放各类编辑器或IDE(集成开发环境)软件的插件,辅助它们查看和编写Go代码
pkg             用于在构建安装后,保存Go语言标准库的所有归档文件。Go源码文件对应于以“.a”为结尾的归档文件,它们就存储在pkg文件夹下的平台相关目录中
robots.txt      搜索引擎robots文件
src             存放所有标准库、Go语言工具,以及相关底层库(C语言实现)的源码
test            存放测试Go语言自身代码的文件

GOPATH

说明:GOPATH的值不能和GOROOT值相同

GOPATH设置的是我们的开发区,用来存放我们项目的源代码。在macOS或Linux操作系统中,GOPATH的默认路径是$HOME/go

GOPATH可以设置多个值,也就是多个工作区,多个工作区之间用分号隔开

GOPATH=/Users/shulv/studySpace/GolangProject;/Users/shulv/studySpace/GolangProject1

如果GOPATH设置了两个工作区,当我们执行go get命令去获取远程库的时候,它会选择最前边那个工作区进行安装

按照go语言的开发规范,工作区目录下一般分三个子目录:src, pkg, bin

bin:存放编译后的可执行文件;

pkg:存放编译后的包文件;

src:存放项目源文件

通常bin 和 pkg 目录可以不创建,go 命令会自动创建(如 go install),只需要创建手动去创建src目录即可

GOBIN

GOBIN用来存放我们的项目代码编译后生成的二进制文件 (可执行文件)。当我们使用go install命令编译打包我们的项目代码时,它会将编译后生成的二进制文件放入到GOBIN指定的目录下。如果没有指定GOBIN目录,默认是GOPATH/bin

GOOS

GOOS的值是为其编译代码的操作系统。例如:linux、darwin、windows、netbsd、freebsd、openbsd、solaris

macOS操作系统对应的值是darwin。可以通过执行go env GOOS查看

GOARCH

GOARCH的值是为其编译代码的CPU架构或处理器。比如amd64、386、arm等

GOARCH和GOOS是成对出现的,比如,如果是macOS系统,那么它们就有以下几种组合形式

GOOS        GOARCH
darwin	    386
darwin	    amd64
darwin	    arm
darwin	    arm64

GOOS和GOARCH这两个环境变量有什么作用呢?

如果我们想在一个平台上可以生成在另一个平台上运行的程序,就需要借助这两个环境变量。对于其它的编程语言,如果想实现在一个平台上可以生成在另一个平台上运行的程序,比如在32位的windows操作系统环境中,生成可以在64位Linux操作系统上运行的二进制程序,通常需要借助第三方的工具才能够实现。但是在GO语言中,只需要设置GOOS和GOARCH这两个环境变量就可以实现

比如我现在在32为的windows操作系统中,想编译能在64为的Linux系统运行的目标程序

1、设置GOOS和GOARCH分别为
linux	    amd64

2、编译目标源代码
go build test.go

GOPROXY

GOPROXY设置的是,go get 下载依赖时使用的代理地址列表。该环境变量也可以设置多个值,多个值之间使用逗号 或竖杠分隔。GOPROXY的默认值为:proxy.golang.org,direct

当用 go 命令查找依赖模块时,它会按顺序访问 GOPROXY 列表中的每个代理,直到收到成功的响应或出现终端错误

GOPROXY 中可能会存在两个关键字来代替代理URL

off:不允许从任何源下载依赖的模块
direct: 直接从版本控制存储库下载,而不是使用模块代理

GO111MODULE

说明:如果你是go语言入门的小白,不知道什么是代码包、命令源码文件、等等,建议先不看这部分,直接看最后的结果,解决安装好go之后,无法编译运行引入其它依赖包的命令源码文件问题

GO111MODULE是 go modules 功能的开关,go modules 是 Go 语言的依赖解决方案,发布于 Go1.11,到Go1.14 推荐在生产上使用。下边简单介绍一下为什么会出现这个 go modules ,更详细的内容,会在后边的文章中系统梳理

为了方便理解下边的内容,首先需要知道,当我们编译一个依赖了其它包的go源码文件时,go查找依赖包的过程是什么样的?这个关乎到go的版本,以及GO111MODULE环境变量的配置。我的安装的go版本及GO111MODULE配置如下:

go版本(go version命令查看)
go version go1.16.6 darwin/amd64

GO111MODULE配置的值(go env GO111MODULE命令查看)
GO111MODULE=""(我没有设置这个值,它默认是空字符串)

先看一下我的项目目录结构,以及文件内容

我的GOPATH对应目录的结构
├── bin
├── pkg
└── src
    ├── entry
    │   └── study.go
    └── studygo
        └── learnGo.go

study.go内容

package main

import "studygo"//引入studygo这个包

func main()  {
	studygo.Test() //使用studygo这个包下的Test()方法
}

learnGo.go内容
package studygo

import "fmt"

func Test() {
	fmt.Println("Just a test")
}

现在我使用go run study.go去编译运行study.go这个源码文件,看一下会提示什么?

执行:go run study.go 

输出结果:study.go:3:8: package studygo is not in GOROOT (/usr/local/go/src/studygo)

提示说:studygo这个包,不在GOROOT这个路径下。也就是说,它在编译执行的过程中,会去GOROOT目录下找使用到的依赖包。关于它如何去找这个包,就跟我们环境变量GO111MODULE有关

下边就看看GO111MODULE设置不同的值,会有什么样的影响

要想了解go modules到底解决了什么问题,先要了解我设置不同的值,会有什么样的效果

  • GO111MODULE=off,无模块支持。go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。意思就是,当我们编译执行一个go源码文件的时候,如果文件中有依赖其它包,它会首先去GOROOT指定的路径下查找,然后再去GOPATH指定的路径下查找
  • GO111MODULE=on,模块支持。go命令行会使用modules,而一点也不会去GOPATH目录下查找
  • GO111MODULE=auto,默认值。go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形: (1)当前目录在GOPATH/src之外且该目录包含go.mod文件,开启模块支持。 (2)当前文件在包含go.mod文件的目录下面。

我安装的go是1.16.6版本的,GO111MODULE默认是空,可以理解成上边说的auto,当该值为auto时,go在找相关依赖的时候,并不会去GOPATH中找,所以上边我们编译执行study.go的时候,会提示找不到依赖。解决办法就是将GO111MODULE设置成off,我们期望的是它在找依赖的时候,如果在GOROOT下没有找到的时候,会去GOPATH下边找

设置GO111MODULE的值为off
go env -w GO111MODULE=off

此时再编译执行study.go,就可以正常打印出结果了

go modules解决了什么问题?

  1. 解决Go 语言长久以来的依赖管理问题
  2. “淘汰”现有的 GOPATH 的使用模式
  3. 统一社区中的其它的依赖管理工具(提供迁移功能)

为什么要淘汰GOPATH 的使用模式?GOPATH 使用模式的缺点是什么?如何用go mod管理一个新项目?这些会在下一篇文章中详细分享

以上仅仅是为了方便大家理解,为什么我们在安装完go以后,使用默认配置,在编译运行一个有依赖包的源码文件时,会报错的问题。关于go modules还有很多的内容,此处因为篇幅原因,不在这里详解,会在后边单独找一篇文章分享。以上内容,如果有理解不正确的地方,欢迎大家评论区指正

感谢以下优秀文章

Golang环境变量设置详解

Golang 环境变量须知

Go入门指南

go语言:环境变量GOPROXY和GO111MODULE设置

Go Modules 终极入门