这是我参与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的时候,该环境变量的值就是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解决了什么问题?
- 解决Go 语言长久以来的依赖管理问题
- “淘汰”现有的 GOPATH 的使用模式
- 统一社区中的其它的依赖管理工具(提供迁移功能)
为什么要淘汰GOPATH 的使用模式?GOPATH 使用模式的缺点是什么?如何用go mod管理一个新项目?这些会在下一篇文章中详细分享
以上仅仅是为了方便大家理解,为什么我们在安装完go以后,使用默认配置,在编译运行一个有依赖包的源码文件时,会报错的问题。关于go modules还有很多的内容,此处因为篇幅原因,不在这里详解,会在后边单独找一篇文章分享。以上内容,如果有理解不正确的地方,欢迎大家评论区指正