Golang总结一

从13年开始接触golang,一直对golang十分喜爱,前前后后写过一些代码,包括业余的,生产环境的项目。 一直想写点总结好让后来人少趟点坑,正好周末天气不好,只能窝在家中写总结。

先说$GOPATH

基本每个刚入门golang的都得先跟$GOPATH过个照面,相信网上也有很多资料,如何设置使go代码运行,怎样设置更适合自己,相信每个老手都有自己的想法与判断。

我且说说我的思考。

  • $GOPATH是Golang唯一必须设置的环境变量
  • $GOPATH指向的golang的标准工作区
  • $GOPATH可以根据具体情况自由更改
  • $GOPATH可以指定多个位置

golang官方关于$GOPATH的介绍如下:

The GOPATH environment variable is used to specify directories outside of $GOROOT that contain the source for GO projects and their binaries.

$GOPATH是一个环境变量。它指定golang项目的源码和可执行码路径。在$GOROOT之外。

不得不提下$GOROOT。

$GOROOT是GO可执行命令的路径,默认为操作系统的个人用户可执行目录。如Ubuntu下/usr/local/bin

如果通过安装文件(dmg/exe)或包管理器(apt-get/yum)默认安装,GO可执行命令在环境路径下,无须设置。 当用户编译安装,自由指定目录时,设置$GOROOT,并将其放入环境路径下。如/usr/local/go,需将其插入PATH中:

1
2
$ export GOROOT=/usr/local/go
$ export PATH=$PATH:$GOROOT/bin

$GOPATH与标准工作区

提$GOPATH不得不提标准工作区。Golang的标准工作区不太简单,也不优雅。但一旦习惯,确实很实用。官网方描述如下:

A workspace is a directory hierarchy with three directories at its root:

src contains Go source files organized into packages (one package per directory), pkg contains package objects, and bin contains executable commands.

Golang工作区是一个包含有src, bin, pkg三个目录的根路径。

$GOPATH指定了Golang的工作区。可以指定系统任意位置,如$HOME, $HOME/work。官方推荐:

1
export GOPATH=$HOME

注意,$GOPATH不能与$GOROOT一致。

属于$GOPATH的自由

虽然80%的情形,无须修改$GOPATH。但$GOPATH是一个环境变量,我们可以根据需求任意对其进行临时修改。而且对于某些场景,修改$GOPATH不失为一个好的临时解决方案:

场景一: git clone

当在文件系统任意位置git clone外部Golang项目后,只需临时修改$GOPATH即可快速运行

1
2
3
4
$ git clone https://github.com/cloudfoundry/hm-workspace
$ cd hm-workspace
$ export GOPATH=$PWD
$ go install

场景二: direnv

1
2
3
4
5
6
$ git clone https://github.com/direnv/direnv
$ cd direnv
$ make install

$ cd <your-workspace>
$ vim .envrc

$GOPATH是可以指定多个位置

1
$ export GOPATH=$HOME:$HOME/workspace<:...>

理解这层,可以很快地解决$GOPATH问题,即把所有需要用的内部外部依赖,均放到$GOPATH上。

对于开发环境,可以更灵活地运行实验项目。

对于生产环境,可以更好地解耦依赖,实现自动化。

1
$ export GOPATH=$PWD:$PWD/Godep/_workspace go build -o $PWD/bin

参考资料

https://golang.org/doc/code.html

https://github.com/golang/go/wiki/GOPATH

https://github.com/direnv/direnv