Go 语言简介

2016-08-15 Monday

golang 目前越来越火,包括了 Docker、InfluxDB、etcd 等等,越来越多的工程都在使用 golang 。虽然它的语法都比较 “奇葩”,一些高级语言支持的特性却都不支持,但其高并发、高效率等等,也使其热度不减。

这篇文章主要简单介绍下 golang 环境的搭建。

golang logo

环境配置

golang 有多种安装方式,主要包括了三种最常见的安装方式:

  • 第三方工具。也就是一些常见操作系统的软件管理工具,如 Ubuntu 的 apt-get、CentOS 的 yum、Mac 的 homebrew 等,还有就是类似 GVM 的工具。

  • Go 标准包安装。官网也提供了已经编译好的二进制安装包,支持 Windows、Linux、Mac等系统,包括 X86、ARM 等平台。

  • Go 源码安装。对于经常使用 *nix 类系统的用户,尤其对于开发者来说,这种方式比较熟悉,而且从源码安装可以自己进行定制。

其中,上面提到了一个 GVM 工具,如果想在同一个系统中安装多个版本,建议可以使用该工具。

YUM 安装

在 CentOS-7 中可以通过 yum list all | grep golang 查看、安装,该二进制包在 base 中。

# yum install golang

标准包安装

可以从 golang.org/dl 上下载源码包,当然也可以从 golangtc.com 上下载。其中包的名称类似于 go1.6.linux-amd64.tar.gz ,从中选择相应的平台,压缩包中是已经编译好的二进制包,可以直接下载解压即可。

源码安装

直接下载源码安装,之前的时候需要 gcc 编译,现在基本可以通过 go 搞定了。

I. 下载源码

go 的 官方页面 之前打不开,可以从 Golang 中国 上下载,不过最近发现好像是放开了。

II. 设置环境变量

通常可以在 ~/.bashrc 中设置如下的环境变量,然后通过 source ~/.bashrc 使其立即生效。

export GOPATH=$HOME/Workspace/go             ← 可以指定多个通过:分隔
export GOROOT=${GOPATH}/goroot               ← 默认在/usr/local/go,否则需要指定
#export GOBIN=$GOROOT/bin                    ← 指定默认bin目录
#export GOARCH=386
#export GOOS=linux
export PATH=${PATH}:${GOBIN}

III. 编译源码

如果下载的是只是源码,可以通过 ./all.bash 进行编译,也可以下载包含可执行文件的 tarball 包。

$ go env                                     ← 查看环境变量
$ go version                                 ← 查看版本

Hello world

保存如下的内容为 hello.go 文件,然后通过 go run hello.go 执行,此时会输出 Hello World!。

package main
import "fmt"
func main() {
    fmt.Printf("Hello World!\n")
}

当然可以用更简单的。

package main
func main() {
    println("Hello World!")
}

另外,在源码目录下,可以直接通过 go build 进行编译,此时将编译该目录下所有的源码,并生成与 目录名称 相同的二进制文件。

当然,也可以在源码目录下执行 go install 进行安装;或者将上述代码放到 $GOPATH/src/examples/hello 目录下,然后执行 go install examples/hello 即可,此时就会编译并安装到 $GOPATH/bin 目录下。

其它

环境变量

介绍下一些常见的环境变量使用方法,可以通过 go env 查看当前的环境变量。

GOROOT

指定 golang 的安装路径,如果通过 yum 安装,可以使用系统默认的值,此时直接通过 unset GOROOT 取消该环境变量即可。

GOBIN

install 编译存放路径,不允许设置多个路径。可以为空,此时可执行文件会保存到 $GOPATH/bin 目录下。

GOPATH

唯一一个 必须设置 的环境变量,GOPATH 的作用是告诉 Go 命令和其他相关工具,在那里去找到安装在你系统上的 Go 包。这是一个路径的列表,一个典型的 GOPATH 设置如下,类似 PATH 的设置,Windows 下用分号分割。

export GOPATH=$HOME/go:$HOME/go/gopath
export PATH=$PATH:${GOPATH//://bin:}/bin

最后一条,在 Linux/Mac 中把每个 GOPATH下 的 bin 都加入到 PATH 中。

每一个列表中的路径是一个工作区的位置,每个工作区都有源文件、相关包的对象、执行文件。GOPATH 必须设置编译和安装包,即使用标准的 Go 目录树,类似如下:

|-- bin/
|   `-- foobar               (installed command)
|-- pkg/
|   `-- linux_amd64/
|       `-- foo/
|           `-- bar.a        (installed package object)
`-- src/
    `-- foo/
        |-- bar/             (go code in package bar)
        |   `-- bar.go
        `-- foobar/          (go code in package main)
            `-- foobar.go

其它

需要注意的是,GROOT 和 GOPATH 可以设置为不同的路径

常用命令

简单列举一下一些常用的工具。

$ go version            # 当前的版本
$ go env                # 环境变量
$ go list               # 列出全部已安装的package
$ go run                # 编译并运行Go程序
$ go help               # 查看帮助
$ go install            # 安装,需要保证源码已经下载

go build

用于编译,在包的编译过程中,若有必要,会同时编译与之相关联的包。

go clean

用来移除当前源码包里面编译生成的文件。

go fmt

主要是用来帮你格式化所写好的代码文件,只需要简单执行 fmt go test.go 命令,就可以让 go 帮我们格式化我们的代码文件。

其中通过 -w 可以将格式化结果保存到文件中,当然可以使用目录作为参数,格式化整个工程。

go get

用来动态获取远程代码包的,目前支持的有 BitBucket、GitHub、Google Code 和 Launchpad。

这个命令在内部实际上分成了两步操作:1) 下载源码包;2) 执行 go install。下载源码包的 go 工具会自动根据不同的域名调用不同的源码工具,当然必须确保安装了合适的源码管理工具。

另外,其实 go get 支持自定义域名的功能,具体参见 go help remote 。

go install

该命令在内部实际上分成了两步操作:1) 生成目标文件,可执行文件或者 .a 包;2) 把编译好的结果移到 $GOPATH/pkg 或者 $GOPATH/bin 目录下。

go test

该命令会自动读取源码目录下面名为 *_test.go 的文件,生成并运行测试用的可执行文件,输出的信息类似:

ok   archive/tar   0.011s
FAIL archive/zip   0.022s
ok   compress/gzip 0.033s

默认的情况下,不需要任何的参数,它会自动把你源码包下面所有 test 文件测试完毕,当然你也可以带上参数,详情请参考 go help testflag 。

go doc

go doc 命令其实就是一个很强大的文档工具。

$ go doc builtin                  # 查看builtin文档
$ go doc net/http                 # http包的报文帮助
$ go doc fmt Printf               # 查看包中的某个函数
$ go doc -http=:8080              # 浏览器打开127.1:8080

通过 -http 参数,将会看到一个 golang.org 的本地 copy 版本,通过它你可以查看 pkg 文档等其它内容。设置了GOPATH 后,不但会列出标准包的文档,还会列出你本地 GOPATH 中所有项目的相关文档,这对于经常被限制访问的用户来说是一个不错的选择。

三方包

简单以安装 GoLang Colorized Output 包为例。

$ go get github.com/bclicn/color

当然,也可以手动下载源码,放到 $GOPATH/src/github.com/bclicn/color 目录下,然后直接执行 go install 命令。

如果没有下载源码,可能会导致如下的报错。

$ go install color
can't load package: package color: cannot find package "color" in any of:
        $GOROOT/goroot/src/color (from $GOROOT)
        $GOPATH/src/color (from $GOPATH)

另外,Github golang/tools 中是一个 golang.org/x/tools 的镜像,可以直接将上述的代码仓库下载下来,然后放到 $GOPATH/golang.org/x/tools 目录下即可。

三方工具

简单介绍下一些常见的工具。

golang logo

GVM (Go Version Manager)

工程项目保存在 Github moovweb/gvm 中,这是一套使用 Bash 编写的脚本工具,支持多个 go 编译器共存,方便进行切换。

首先,需要安装一些常见的工具,这个是在 scripts/gvm-check 脚本中检查。

$ yum install git binutils bison gcc make curl

如果感兴趣,可以直接查看其源码,其实很简单,只是设置好环境变量即可,接下来看看如何安装,并使用。

----- 下载安装脚本并直接执行
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

默认会直接将上述的代码仓库 Clone 到 ~/.gvm 目录下,并在 ~/.bashrc 中添加一行脚本执行命令,用来设置环境变量。

安装

其中,每个子命令执行的脚本,实际是对应到 script 目录下相应名称的脚本;另外,建议可以直接下载该工具,然后下载相应的 go 版本。

$ gvm install go1.4             ← 安装相应的版本
$ gvm use go1.4 --default       ← 设置使用相应的版本,可同时设置为默认

注意,go-1.5 之后的版本,将 C 编译器使用 go 编译器直接替换掉了,这也就意味着,如果你要安装 1.5 之后的版本,需要先安装 1.4 版的才可以。

这也就是说,需要如下两步:1) 用 gcc 编译生成 go-1.4;2) 用 go-1.4 编译大于 go-1.5 的版本。

当然,上述的方式是通过源码安装的,假设,你已经通过 yum 安装好了 go ,那么可以通过如下方式进行编译。实际上就是将 GOROOT_BOOTSTRAP 环境变量设置为安装目录,如下所示。

$ export GOROOT_BOOTSTRAP=/usr/lib/golang

实际上,安装完之后,相关的数据会保存在如下的目录中 (假设版本为go1.5) 。

~/.gvm/gos/go1.5
~/.gvm/pkgsets/go1.5
~/.gvm/environments/go1.5

简单来说,需要设置环境变量,会保存在 ~/.gvm/environments/ 中,可以用来设置相应的变量;例如,你可以将 GOPATH 设置为自己想放置的目录。

常用命令

如下统计常用的命令。

$ gvm list                      ← 查看当前所有版本
$ gvm install go1.4             ← 安装
$ gvm use go1.4 --default       ← 设置当前使用版本

GDM (Go Dependency Manager)

源码可以从 Github sparrc/gdm 上下载,其工作原理很简单,可以通过 save 命令会生成 Godeps 文件,保存了相关的包及其版本。

在新的环境中,通过 restore 命令可以下载代码包。

参考

官方网站 golang.org 被墙,常见的工具可以从 Gopm Registry 上下载,而文档资料等可以从 Golang 中国 上查看。

文档


About This Blog

Recent Posts

Categories

Related Links

  • RTEMS
    RTEMS
  • GNU
  • Linux Kernel
  • Arduino

Search


This Site was built by Huang Yongyao, generated with Jekyll, and is hosted on GitHub Pages
©2012-2017 – Huang Yongyao