go语言自带一套完整的命令操作系统,你可以在终端中执行go
命令来进行查看!接下来介绍一些常用的go
命令操作
go version
查看go当前的版本
go env
查看当前go的环境变量
go list
查看当前安装的全部package
go run
编译并运行go程序
go build
这个命令主要用于编译代码。在包的编译过程中,若有必要,会同时编译与之相关联的包。go build
命令有如下几点值得注意的地方:
- 如果是普通包,当你执行
go build
命令之后,它不会产生任何文件。如果你需要在$GOPATH/pkg
下生成相应的文件,那就得执行go install
命令 - 如果是
main
包,当你执行go build
命令之后,它就会在当前目录下生成一个可执行文件。如果你需要在$GOPATH/bin
下生成相应的文件,那么你需要执行go install
命令,或者使用go build -o 路径/xx
- 如果项目文件夹中有多个文件,但是此时你只想编译其中某一个文件,就可以在
go build
之后加上文件名,例如:go build demo_1.go
。默认情况下,build
命令会编译当前目录下所有go文件 - 你也可以指定编译输出的文件名。我们可以使用
go build -o xxx
,来指定编译输出的文件名,默认情况下是你的项目名 -
go build
会自动忽略以_
或者.
开头的go文件 - 如果你的源代码针对不同操作系统需要不同的处理,那么你可以根据不同操作系统后缀来命名文件。例如有一个读取数组的程序,它对于不同的操作系统可能有如下几个源文件:
array_linux.go
array_windows.go
array_darwin.go
go build
会选择性的编译以系统名结尾的文件,例如,在Linux系统下编译只会选择array_linux.go文件,其他系统命名后缀文件全部忽略!
常用参数介绍:
-
-o
:指定输出的文件名,可以带上路径,例如:go build -o app/a.exe
-
-i
:安装相应的包,相当于build+install -
-a
:更新全部已经是最新的包的 -
-n
:把需要执行的编译命令打印出来,但是不执行它们 -
-p n
:指定可以并行运行的编译数目,默认是CPU数量 -
-race
:开启编译的时候自动检测数据竞争的情况,目前只支持64位的机器 -
-v
:打印出来正在编译的包名 -
-work
:打印出来编译时间的临时文件夹名称,并且如果已经存在的话就不要删除 -
-x
:打印出来执行的命令,与-n
类似,只不过这个会执行
go clean
这个命令是用来移除当前源码包和关联源码包里面编译生成的文件,这些文件包括:
-
_obj/
:旧的object目录,由Makefiles遗留 -
_test/
:旧的test目录,由Makefiles遗留 -
_testmain.go
:旧的gotest文件,由Makefiles遗留 -
test.out
:旧的test记录,由Makefiles遗留 -
build.out
:旧的test记录,由Makefiles遗留 -
*.[568ao]
:object文件,由Makefiles遗留 -
DIR(.exe)
:由go build
产生 -
DIR.test(.exe)
:由go test -c
产生 -
MAINFILE(.exe)
:由go build MAINFILE.go
产生 -
*.so
:由SWIG产生
参数介绍:
-
-i
:清楚关联的安装包和可运行文件,也就是通过go install
安装的文件 -
-n
:把需要执行的清除命令打印出来,但是不执行 -
-f
:循环的清除在import引入的包 -
-x
:打印出来执行的详细命令,与-n
类似,只不过这个会执行
举个栗子:
$ go clean -i -x
cd /root/go_path/src/cx_demo
rm -f cx_demo cx_demo.exe cx_demo.test cx_demo.test.exe demo_1 demo_1.exe
rm -f /root/go_path/bin/cx_demo
go fmt
在go
中,代码有着标准的风格。由于之前已经有的一些习惯或其它原因我们常将代码写成ANSI风格或者其它更适合自己的格式,这将为人们在阅读别人的代码时添加不必要的负担,所以go强制了代码格式(比如大括号必须放在行尾),不按照此排版的代码将不能编译通过,为了减少浪费在排版上的时间,go工具集中提供了一个go fmt
命令,它可以帮你格式化你写好的代码文件。
参数介绍:
-
-n
:标记打印将要执行的命令 -
-x
:打印出来执行的详细命令,与-n
类似,只不过这个会执行
go get
这个命令是用来获取远程代码包的,目前支持的有BitBucket
、GitHub
、Google Code
和LaunchPad
。这个操作实际上在内部分为了两步:第一步是下载源码包,第二部是执行go install
。下载源码包的go工具会自动根据不同的域名调用不同的源码工具,对应关系如下:
BitBucket(Mercurial Git)
GitHub(Git)
Google Code Project Hosting(Git, Mercurial, Subversion)
LaunchPad(Bazaar)
所以,为了go get
能正常工作,你必须安装了合适的源码管理工具,并同时把这些命令加入你的PATH中。
参数介绍:
-
-d
:只下载不install -
-f
:只有设置了-u
参数才有意义!不让-u
去验证import中的每一个都已经获取了 -
-fix
:在获取源码之后先运行fix
,然后再去做其他的事情 -
-t
:同时下载需要为运行测试所需要的包 -
-u
:强制使用网络去更新包和它的依赖 -
-v
:显示执行的命令
go install
这个命令在内部实际分成了两步操作:第一步是生成结果文件(可执行文件或者.a包),第二部会把编译好的结果转移到$GOPATH/bin
或者$GOPATH/pkg
。参数支持所有的go build
参数,但是,我们只需要记住一个-v
参数即可,这可以可以随时查看底层的执行信息!值得注意的是,有两种方式进行安装:
- 进入对应的项目目录之下,然后执行
go isntall
,就可以安装了 - 在任意的目录之下执行
go install xxx
go test
执行这个命令,会自动读取源码目录下面的*_test.go
文件,生成并运行测试用的可执行文件。输出的信息类似:
ok archive/tar 0.011s
FAIL archive/zip 0.022s
ok compress/gzip 0.033s
...
常用的参数介绍:
-
-bench regexp
:执行相应的benchmarks -
-cover
:测试覆盖率 -
-run regexp
:只运行regexp匹配的函数,例如-run=Array
那么就执行包含Array
开头的函数 -
-v
:显示测试的详细命令
go tool
go tool
下面下载聚集了很多命令,这里我们只介绍两个,fix和vet:
-
go tool fix
:用来修复以前老版本的代码到新版本,例如go1之前老版本的代码转化到go1 -
go tool vet directory|files
:用来分析当前目录的代码是否都是正确的代码,例如是不是调用fmt.Println里面的参数不正确,例如函数里面提前return了然后出现了无用代码之类的
go generate
这个命令是从Go1.4才开始设计的,用于在编译前自动化生成某类代码。go generate
和go build
是完全不一样的命令,通过分析源码中的特殊注释,然后执行相应的命令。这些命令很明确,没有任何的依赖在里面。举个简单的栗子:
go tool yacc -o gopher.go -p parser gopher.y
如果你想让go generate
来触发这个命令,那么就可以在应用目录之下的任意一个go文件里面的任意位置添加一行如下注释:
//go:generate go tool yacc -o gopher.go -p parser gopher.y
其中go:generate
是固定格式,扫描源码文件的时候就是根据这个来判断的!然后我们就可以在应用目录之下执行go generate
,如下:
$ go generate
godoc
在Go1.2版本之前还支持go doc
命令,但是之后全部移到了godoc
命令之下。
很多人说go不需要任何的第三方文档,因为它内部就有一个很强大的文档工具。那么如何查看相应package的文档呢?例如builtin
包,那么就执行godoc builtin
;如果是http,那么就执行godoc net/http
;如果查看某一个包里的函数,那么就执行godoc fmt Printf
;我们也可以执行godoc -src fmt Printf
来查看相应的代码
至此,Over~~~~