Mac下搭建Go开发环境

目录

第一步:下载并安装Go开发包

第二步:在系统中设置环境变量GOROOT、GOPATH和PATH

第三步:使用Goland等IDE

常见误区

误区一:自己的项目必须放在GOPATH下

误区二:Go项目结构必须是bin,pkg,src

总结


春节过后由于工作需要开始使用Go语言开发,工作环境是Mac。由于无法因此无法查阅到官方的Go文档,在网上尝试找了一些资料,但都不系统和准确,自己摸索了几天后终于理解了Go开发环境的设置,也解开了一些误区。

虽然我的工作环境是Mac OS,但可以借鉴到其他环境。这里需要通过命令行设置环境变量,因此假设读者熟悉Mac OS或者UNIX/Linux中目录结构、命令行以及环境变量的基本概念。

第一步:下载并安装Go开发包

Go开发包包括了官方提供的包和源码,类似于Java的JDK,C#的.NET Framework

下载地址:https://golang.google.cn/dl/

建议选择压缩包而非安装包,这样可以我们可以自己选择解压的目录,并且手动设定环境变量。虽然使用安装包比较简单,但是后期如果想更换安装路径,则更改起来比较麻烦。另外手动安装可以帮助我们理解Go开发环境是如何设置的,后期遇到问题时可以很容易定位到问题。

下载后将开发包解压到某目录下,如~/Lib/Go

第二步:在系统中设置环境变量GOROOT、GOPATH和PATH

  • GOROOT是Go开发包的安装目录,这里为~/Lib/Go
  • GOPATH是Go开发时第三方包的目录,这里我们指定为~/Lib/GoPath,该目录有两个作用:
    • 使用"go get <包地址>"时,会将包下载到该目录,该目录下自动会创建三个字目录bin, pkg, src
    • 在Go程序中import语句会从$GOPATH/src下寻找包
  • PATH:是系统自带的环境变量,将$GOROOT/bin加入该环境变量可以方便让我们在任意目录下编译和运行Go程序

如何设置上述环境变量呢?如果只针对当前用户生效,可以只修改~/.bash_profile,如果无该文件需要新建一个。

修改该文件内容如下:

export GOROOT=$HOME/Lib/go
export GOPATH=$HOME/Lib/GoPath
export PATH=$PATH:$GOROOT/bin

保存退出后执行如下语句使改动生效:

source ~/.bash_profile

在Terminal中任意目录下运行如下命令测试,观察是否设置成功:

echo $GOROOT
echo $GOPATH
echo $PATH

如果成功则可以运行如下go命令,查看go是否成功读取到上述环境变量:

go env

我们期望得到如下结果,注意其中GOROOT和GOPATH的值:

GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/natty1412/Library/Caches/go-build"
GOENV="/Users/natty1412/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/natty1412/Lib/GoPath"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/Users/natty1412/Lib/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/Users/natty1412/Lib/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/gj/mgvg2py16xg636jjdx24hxc40000gp/T/go-build815282575=/tmp/go-build -gno-record-gcc-switches -fno-common"

到这一步,我们已经可以创建并运行我们的第一个go程序了!

第三步:第一个Go程序

在任意目录下(不一定在GOPATH的子目录),创建文件main.go如下:

package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello world!")
}

保存退出后,运行如下命令:

go run main.go

我们期望得到如下结果:

Hello world!

第四步:使用Goland等IDE

使用IDE的好处是可以调试我们的程序,帮助我们重构代码,查看引用包的源代码,提高我们开发的效率。尽管我们在第二步已经在操作系统中设置了环境变量,但是我们可能需要在IDE中重新检查一下,确保GOROOT和GOPATH和我们设置的一样。

Go语言有很多IDE可以选择,抛开收费因素,在广大开发者心目中Goland还是比较好用的,当然我们也可以选择其他IDE。

  • GOROOT: 在Goland中,我们可以添加多个GOROOT目录作为备选,但是当前项目只能使用一个。
  • GOPTAH: 在Goland中,我们可以指定多个目录,默认情况下以下两个目录会自动成为GOPATH
    • GOROOT
    • 环境变量中的GOPATH

基本上做好以上的设置,我们就可以在Goland中创建Go项目进行开发了。

常见误区

国人在网上关于Go的文章有不少,但是精品不多,即使是原创性的文章,也缺少一定的系统性、逻辑性和完备性。当从其他地方得到碎片化的知识自己尝试成功后就万事大吉,缺少深入的思考和事后的分析,把自己错误的观点轻易的传播出来。当被问到为什么时,会说“别人都这么说的”,或者“就是这么规定的”,并没有质疑求证。

有些误区其实是“最佳实践”,但最佳实践并不代表一定要遵守。另外提出最佳实践的作者一定有理由,不了解理由而盲目的遵循最佳实践是不可取的,所谓尽信书不如无书。

有些误区是在传播过程中作者故意为之,比如在教授新人时为了省事,简单粗暴的把这些规则传递给他人,而新人又羞于提问或者知识面比较窄,认为理所当然。对于接触过其他的编程语言的资深软件工程师,那么就会很容易的质疑这些说法。

我这里尝试着澄清几个搭建Go开发环境时的误区,因为自己曾经被这些说法误导过。第一次听到这些说法时觉得很奇怪,觉得一个如此流行的语言却有如此奇葩的规则,难以理解,因此并未轻易相信,也并未遵守。当自己按照自己的方式成功开发出系统原型时,那么这些误区则被不攻自破。

误区一:自己的项目必须放在GOPATH下

GOPATH下主要是存储第三方包,当自己的项目引用这些包时会从GOPATH下寻找。

自己的项目可以放在GOPATH下,也可以不放在GOPATH下,我目前的方式是按照自己存储项目的习惯放到另外的目录。当我们引用同一项目内的包时,import 后面用相对路径就可以。

如果自己有两个项目(包),项目A引用项目B怎么办呢?我还没有这样的需求,按照我的理解,我猜测可以分情况处理:

1. 如果项目B不需要共享给他人,没有独自存在的意义,那么我们可以考虑将项目A和B合并,这样他们会存在于同一个项目目录内,我们就可以用import相对路径的方式引用

2. 项目B有独立存在的意义,需要或者已经共享给他人。那么我们可以有几种方法:

1)把项目B公开到公共的代码仓库,之后通过go get的方式安装项目B,这样会把项目B安装到GOPATH下,这样我们在项目A里就可以直接引用了。

2)如果我们只是自己临时修改了项目B,为了方便快速调试,不想正式发布项目B呢?那么我们可以手动拷贝项目B到GOPATH\src目录下。

3)Goland支持为自己的项目设置项目级别的GOPATH,我们可以把项目B的目录加入到GOPATH下,从而可以在项目A中直接引用。可以参考Goland的帮助文档

4)如果我们不用Goland呢,我查阅了相关的资料,GOPATH是支持设置多个目录的,所以可以把项目B所在目录添加到GOPATH中。但这时的多个目录是全局级别的,并不是项目级别的。因此为了避免包污染,无意中引用到同名不同实现或版本的包,我个人还是建议不要采用这种方法。

本文第三步的Hello world程序就没有放在GOPATH下,因此该说法是不准确的。当然如果所有的项目都放在GOPATH下也许会省很多事情,但是如果强行遵守有时候也会带来一些麻烦。只有区分了规则和最佳实践,才能不被束缚,选择适合自己的方案。

误区二:Go项目结构必须是bin,pkg,src

这个误区很常见,我想主要是因为当我们用"go get"下载第三方包到GOPATH下时,会在GOPATH下自动创建三个子目录bin,pkg,src来管理第三方的包。同理,我们自己写的包被下载安装后也会按照上述方式被管理起来。

但是,这并不意味着我们自己开发go项目时,目录结构必须要按照上述方式。实际上,当我在bing中搜索“go project structure"时可以得到很多建议的项目结构,这里列举一些供大家参考(英文):

  • https://github.com/golang-standards/project-layout
  • https://vsupalov.com/go-folder-structure/
  • https://tutorialedge.net/golang/go-project-structure-best-practices/

上述作者没有一个建议把src作为目录,有的还提出了反对的理由。

另外网上很多开源的Go项目也并不是按照bin-pkg-src的结构组织的。

总结

Go的开发环境其实比较简单,建议GOROOT和GOPATH分开设置,用来分别存储官方的Go开发包和第三方包,而我们自己的Go项目目录可以放在其他任意目录下,并根据需要创建适合项目的目录结构。

因为疫情的原因我近期只能在家工作,无法查阅到Google官方的文档,因此该文章也许有错误的地方,欢迎大家批评指正,我确认之后会修改过来。

你可能感兴趣的:(Go)