Golang是一门年轻的语言。它在设计上借鉴了传统C语言的高性能特性,又借鉴了多种现代语言的优点,被认为具有很大的潜力。要用好Golang,首先要掌握好相关的开发工具。
这里介绍如何快速安装和配置Golang环境,选用合适的编辑器和IDE,以及如何配合使用Golang的配套开发工具来提高开发效率。
安装与配置Golang环境
Golang环境安装十分简单,可以通过包管理器或自行下载方式进行,为了使用最新版本的Golang环境,推荐大家通过下载环境包方式进行安装。
首先,从http://golang.org/dl/ 页面查看最新的软件包,并根据自己的平台进行下载,例如Linux环境下,目前最新的环境包为http://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz 。
下载后,直接进行环境包的解压,存放到默认的/usr/local/go目录(否则需要配置$GOROOT环境变量指向自定义位置)下:
$ sudo tar -C /usr/local -xzf go1.8.linux-amd64.tar.gz
此时,查看/usr/local/go路径下,可能看到如下几个子目录:
·api:Go API检查器的辅助文件,记录了各个版本的API特性;
·bin:Go语言相关工具的二进制命令;
·doc:存放文档;
·lib:一些第三方库;
·misc:编辑器和开发环境的支持插件;
·pkg:存放不同平台标准库的归档文件(.a文件);
·src:所有实现的源码;
·test:存放测试文件。
安装完毕后,可以添加Golang工具命令所在路径到系统路径,方便后面使用。并创建$GOPATH环境变量,指向某个本地创建好的目录(如$HOME/Go),作为后面Golang项目的存放目录。
添加如下环境变量到用户启动配置(如$HOME/.bashrc)中:
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/Go
export GOROOT=/usr/local/go
更多平台下的安装可以参考http://golang.org/doc/install 。
编辑器与IDE
使用传统编辑器如VIM,可以安装相应的Golang支持插件,如vim-go。
目前支持Go语言的IDE(Integrated Development Environment)还不是特别丰富,推荐使用Jet Brains出品的Pycharm或Gogland。
Pycharm本来是面向Python语言的IDE产品,但可以通过安装Go语言插件来支持Go语言。
Gogland是专门针对Go语言设计的IDE,在代码的补全、分析等方面性能更优越。可以从http://www.jetbrains.com/go/ 下载获取。
高效开发工具
Go语言自带了不少高效的工具和命令,使用好这些工具和命令,可以很方便地进行程序的维护、编译和调试。下面介绍部分工具。
1.go doc和godoc
go doc可以快速显示指定软件包的帮助文档。
godoc是一个类似的命令,功能更强大,它以Web服务的形式提供文档,即允许用户通过浏览器查看软件包的文档。可以通过如下命令进行快速安装:
$ go get golang.org/x/tools/cmd/godoc
godoc命令使用格式如下:
$ godoc package [name ...]
比较有用的命令行参数包括:
·-http=:PORT:指定监听的地址,默认为:6060;
·-index:支持关键词索引;
·-play:支持Go语言的playground,用户可以在浏览器里面对Go语言进行测试。
例如,下面的命令将在本地快速启动一个类似http://golang.org/ 的网站,包括本地软件包的文档和playground等(参见图C-1):
$ godoc -http=:6060 -index -play
图C-1 godoc启动本地网站
2.go build
编译软件包,例如编辑当前软件包内容:
$ go build .
支持如下参数:
·-x:可以打印出执行过程的详细信息,辅助调试;
·-gcflags:指定编译器参数;
·-ldflags:指定链接器参数,常见的可以通过-X来动态指定包变量值。
3.go clean
清理项目,删除编译生成的二进制文件和临时文件。使用格式如下:
$ go clean
支持如下参数:
·-i:删除go install安装的文件;
·-n:打印删除命令,而不执行,方便进行测试检查;
·-r:递归清除,对依赖包也执行清理工作;
·-x:执行清除过程同时打印执行的删除命令,方便进行测试检查。
4.go env
打印与go相关的环境变量,命令使用格式如下:
$ go env [var ...]
例如,通过如下命令查看所有跟go相关的环境变量:
$ go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/opt/Go"
GORACE=""
GOROOT="/usr/local/go/1.8.3/libexec"
GOTOOLDIR="/usr/local/go/1.8.3/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-
length=0 -fdebug-prefix-map=/var/folders/d8/3h28zg552853gpp7ymrxl2r80000gn/
T/go-build128111214=/tmp/go-build -gno-record-gcc-switches -fno-common"
CXX="clang++"
CGO_ENABLED="1"
PKG_CONFIG="pkg-config"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
5.go fmt和gofmt
两者都是对代码进行格式化检查和修正。
go fmt命令实际上是对gofmt工具进行了封装,默认调用gofmt-l-w命令。
gofmt命令的使用格式如下:
$ gofmt [flags] [path ...]
支持如下参数:
·-d:仅显示不符合格式规定的地方,不进行修正;
·-e:打印完整错误内容,默认是只打印10行;
·-l:列出不符合格式规定的文件路径;
·-r:重写的规则;
·-s:对代码尝试进行简化;
·-w:对不符合默认风格的代码进行修正。
6.go get
快速获取某个软件包并执行编译和安装,例如:
$ go get github.com/hyperledger/fabric
支持如下参数:
·-u:可以强制更新到最新版;
·-d:仅获取软件包,不执行编译安装。
7.go install
对本地软件包执行编译,并将编译好的二进制文件安装到$GOPATH/bin。
等价于先执行go build命令,之后执行复制命令。
8.go list
列出本地包中的所有的导入依赖。
命令格式为:
$ go list [-e] [-f format] [-json] [build flags] [packages]
其中,-e可以指定忽略出错的包。
9.go run
编译并直接运行某个主程序包。
需要注意,执行go run的程序包必须是主包,意味着包内必须有入口的主函数:main。
10.go test
执行软件包内带的测试用例(*_test.go文件),例如递归执行当前包内所有的测试案例:
$ go test ./...
支持如下参数:
·-v:可以参数来打开详细测试日志,辅助调试。
11.golint
对代码进行格式风格检查,打印出不符合Go语言推荐风格的代码。
安装该工具十分简单,通过如下命令即可快速安装:
$ go get -u github.com/golang/lint/golint
使用时,指定软件包路径即可,如对超级账本Fabric项目所有代码进行风格检查:
$ golint $GOPATH/src/github.com/hyperledger/fabric/...
注意后面的...表示递归检查所有子目录下内容。
12.goimports
也是代码风格检查工具,重点在于对imports相关格式进行检查,比较强大的是能自动修正。
安装该工具十分简单,通过如下命令即可快速安装:
$ go get golang.org/x/tools/cmd/goimports
使用时,也是指定软件包路径即可。
另外,goimports支持几个很有用的参数:
·-d:仅显示修订,不实际写入文件;
·-e:显示所有的错误;
·-l:列出含有错误的文件路径;
·-w:将修订直接写入文件,不显示出来;
·-srcdir:指定对软件包进行查找的相对路径。
13.go tool
go tool命令中包括许多有用的工具子命令,例如addr2line、api、asm、cgo、compile、cover、dist、doc、fix、link、nm、objdump、pack、pprof、trace、vet。
其中,比较常用的包括vet和fix。vet对代码的准确性进行基本检查,如函数调用参数缺失、不可达代码,或调用格式不匹配等。使用也十分简单,指定要检查的软件包路径即可。fix则可以对自动对旧版本的代码进行升级修复,替换为使用新版本的特性。
可以通过go tool cmd-h命令查看子目录具体支持的相关参数,在此不再赘述。
14.govendor
长期以来,Go语言对外部依赖都没有很好的管理方式,只能从$GOPATH下查找依赖。这就造成不同用户在安装同一个项目时可能从外部获取到不同的依赖库版本,同时当无法联网时,无法编译依赖缺失的项目。
自1.5版本Go语言开始引入govendor工具,该工具将项目依赖的外部包放到项目下的vendor目录下(对比Nodejs的node_modules目录),并通过vendor.json文件来记录依赖包的版本,方便用户使用相对稳定的依赖。
对于govendor来说,主要存在三种位置的包:项目自身的包组织为本地(local)包;传统的存放在$GOPATH下的依赖包为外部(external)依赖包;被govendor管理的放在vendor目录下的依赖包则为vendor包。
具体来看,这些包可能的类型如表C-1所示。
表C-1 vendor包的类型
常见的命令如表C-2所示,格式为govendor COMMAND。通过指定包类型,可以过滤仅对指定包进行操作。
表C-2 常见的命令
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })(); '); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();