【译】Go工具要点

oqbm4312 8年前
   <p>你是刚开始使用Go工具么?或者你想扩展知识?这篇文章将会描述每个人都需要知道的Go工具参数。</p>    <h3><strong>$ go build -x</strong></h3>    <p>-x 会列出来 go build 调用到的所有命令。</p>    <p>如果你对Go的工具链好奇,或者使用了一个跨C编译器,并且想知道调用外部编译器用到的具体参数,或者怀疑链接器有bug;使用 -x 来查看所有调用。</p>    <pre>  $ go build -x  WORK=/var/folders/00/1b8h8000h01000cxqpysvccm005d21/T/go-build600909754  mkdir -p $WORK/hello/perf/_obj/  mkdir -p $WORK/hello/perf/_obj/exe/  cd /Users/jbd/src/hello/perf  /Users/jbd/go/pkg/tool/darwin_amd64/compile -o $WORK/hello/perf.a -trimpath $WORK -p main -complete -buildid bbf8e880e7dd4114f42a7f57717f9ea5cc1dd18d -D _/Users/jbd/src/hello/perf -I $WORK -pack ./perf.go  cd .  /Users/jbd/go/pkg/tool/darwin_amd64/link -o $WORK/hello/perf/_obj/exe/a.out -L $WORK -extld=clang -buildmode=exe -buildid=bbf8e880e7dd4114f42a7f57717f9ea5cc1dd18d $WORK/hello/perf.a  mv $WORK/hello/perf/_obj/exe/a.out perf</pre>    <h3><strong>$ go build -gcflags</strong></h3>    <p>这个参数将会传递给编译器。 go tool compile -help 列出来了所有我们可以传递给编译器的参数。</p>    <p>例如,禁用编译器优化和内联优化,你可以使用下面的参数:</p>    <pre>  $ go build -gcflags="-N -I"</pre>    <h3><strong>$ go test -v</strong></h3>    <p>这个命令可以为测试提供完整的输出。它会打印测试名称、状态(成功或者失败)、测试所耗费的时间,还有测试的日志等等。</p>    <p>如果不使用 -v 参数来测试,输出很少很多,我经常使用 -v 参数来打开详细测试日志。例子:</p>    <pre>  $ go test -v context  === RUN   TestBackground  --- PASS: TestBackground (0.00s)  === RUN   TestTODO  --- PASS: TestTODO (0.00s)  === RUN   TestWithCancel  --- PASS: TestWithCancel (0.10s)  === RUN   TestParentFinishesChild  --- PASS: TestParentFinishesChild (0.00s)  === RUN   TestChildFinishesFirst  --- PASS: TestChildFinishesFirst (0.00s)  === RUN   TestDeadline  --- PASS: TestDeadline (0.16s)  === RUN   TestTimeout  --- PASS: TestTimeout (0.16s)  === RUN   TestCanceledTimeout  --- PASS: TestCanceledTimeout (0.10s)  ...  PASS  ok   context 2.426s</pre>    <h3><strong>$ go test -race</strong></h3>    <p>现在可以使用Go工具提供的 -race 参数进行竞争检测。它会检测并报告竞争。开发的过程中用这个命令来检测一下。</p>    <p>注:完整的命令是:</p>    <pre>  $ go test -race mypkg    // to test the package  $ go run -race mysrc.go  // to run the source file  $ go build -race mycmd   // to build the command</pre>    <h3><strong>$ go test -run</strong></h3>    <p>你可以在测试的时候通过 -run 参数来正则匹配过滤需要测试的代码。下面的命令只会运行 <a href="/misc/goto?guid=4959717429258698434" rel="nofollow,noindex">test examples</a> 。</p>    <pre>  $ go test -run=Example</pre>    <h3><strong>$ go test -coverprofile</strong></h3>    <p>当测试一个包的时候,可以输出一个测试覆盖率,然后使用命令 go tool 来在浏览器里面可视化。</p>    <pre>  $ go test -coverprofile=c.out && go tool cover -html=c.out</pre>    <p>上面的命令将会创建一个测试覆盖率文件在浏览器打开结果。可视化的结果看起来是下面的结果:</p>    <p><img src="https://simg.open-open.com/show/ef56bf21fe72e6992d2672f3c36ee61a.png"></p>    <p>注:测试fmt包</p>    <pre>  go test -coverprofile=c.out fmt</pre>    <h3><strong>$ go test -exec</strong></h3>    <p>一般很少有人知道Go的这个功能,你可以通过 -exec 插入另一个程序。这个参数允许通过Go工具完成一些外部工作。</p>    <p>一个常见的需求场景是你需要在一些宿主机上面执行一些测试。我们可以通过 -exec 命令调用 adb 命令来把二进制文件导入安卓设备并且可以收集到结果信息。参考 <a href="/misc/goto?guid=4959717429340512377" rel="nofollow,noindex">这个</a> 来在安卓设备上面执行。</p>    <h3><strong>$ go get -u</strong></h3>    <p>如果你通过 go get 命令获取Go包,而这个包已经存在于本地的 GOPATH ,那么这个命令并不会帮你更新包。 -u 可以强制更新到最新版。</p>    <p>如果你是一个库作者,你最好在你的安装说明上加上 -u 参数,例如, <a href="/misc/goto?guid=4959717429427909406" rel="nofollow,noindex">golint</a> 是这么做的:</p>    <pre>  $ go get -u github.com/golang/lint/golint</pre>    <h3><strong>$ go get -d</strong></h3>    <p>如果你想clone一个代码仓库到 GOPATH 里面,跳过编译和安装环节,使用 -d 参数。这样它只会下载包并且在编译和安装之前停止。</p>    <p>当需要clone虚拟网址代码仓库的时候,我经常使用这个命令来代替 git clone ,因为这样可以把Go代码自动放入合适的目录下面。例如:</p>    <pre>  $ go get -d golang.org/x/oauth2/...</pre>    <p>这样可以克隆到 $GOPATH/src/golang.org/x/ouath2 目录下面。假设 golang.org/x/oauth2 是一个虚拟网址,通过 go get 获取这个代码仓库要比找出仓库的真实地址(go.googlesource.com/oauth2)更简单。</p>    <h3><strong>$ go get -t</strong></h3>    <p>如果你的测试包的有附加的依赖包, -t 可以一并下载测试包的依赖包。如果没有加这个参数, go get 只会下载非测试包的依赖包。</p>    <h3><strong>$ go list -f</strong></h3>    <p>这个命令可以列出来Go的所有包,并且可以指定格式。这个写脚本的时候很有用。</p>    <p>下面这个命令将会打印所有依赖的 runtime 包</p>    <p>go list -f ‘’ runtime [runtime/internal/atomic runtime/internal/sys unsafe]</p>    <p> </p>    <p> </p>    <p>来自:http://blog.cyeam.com/golang/2016/09/27/go-tool-flags</p>    <p> </p>