Golang 标准命令

go build

  • 在编译只包含库源码文件的代码包时,只会检查性的编译,不会输出任何结果文件
  • 在编译命令源码文件时,生成可执行包
  • go build会忽略目录下以“_”或“.”开头的go文件
  • go build的时候会选择性地编译以系统名结尾的文件(Linux、Darwin、Windows、Freebsd)

常用参数详解:

  • -o 指定输出的文件名,可以带上路径,例如 go build -o a/b/c
  • -i 安装相应的包,编译+go install
  • -a 更新全部已经是最新的包的,但是对标准包不适用
  • -n 把需要执行的编译命令打印出来,但是不执行,这样就可以很容易的知道底层是如何运行的
  • -p n 指定可以并行可运行的编译数目,默认是CPU数目
  • -race 开启编译的时候自动检测数据竞争的情况,目前只支持64位的机器
  • -v 打印出来我们正在编译的包名
  • -work 打印出来编译时候的临时文件夹名称,并且如果已经存在的话就不要删除
  • -x 打印出来执行的命令,其实就是和-n的结果类似,只是这个会执行
  • -ccflags ‘arg list’ 传递参数给5c, 6c, 8c 调用
  • -compiler name 指定相应的编译器,gccgo还是gc
  • -gccgoflags ‘arg list’ 传递参数给gccgo编译连接调用
  • -gcflags ‘arg list’ 传递参数给5g, 6g, 8g 调用
  • -installsuffix suffix 为了和默认的安装包区别开来,采用这个前缀来重新安装那些依赖的包,-race的时候默认已经是-installsuffix race,大家可以通过-n命令来验证
  • -ldflags ‘flag list’ 传递参数给5l, 6l, 8l 调用
  • -tags ‘tag list’ 设置在编译的时候可以适配的那些tag,详细的tag限制参考里面的 Build Constraints

go install

go install 比 go build 多做一件事,安装编译后的结果文件到指定目录。

  • 如果为库源码文件,会把编译后的结果文件保存在源码文件所在工作目录pkg下。 对于仅包含库源码文件的代码包来说,这个结果文件就是对应的代码包归档文件,也叫静态链接库,以.a结尾如果为命令源码文件,
  • 将生成的二进制文件放到当前目录或GOBIN目录下

go get

用来动态获取远程代码包

常用参数详解:

  • -d 只下载不安装
  • -f 只有在你包含了-u参数的时候才有效,不让-u去验证import中的每一个都已经获取了,这对于本地fork的包特别有用
  • -fix 让命令程序在下载代码包之后执行修正动作,而后进行编译和安装
  • -t 同时下载测试所需代码包
  • -u 强制使用网络去更新包和它的依赖包, 安装代码包,不论工作区中是否已存在它们
  • -v 显示执行的命令
  • -insecure 允许通过非安全的网络协议下载和安装代码包。eg: http

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 把需要执行的清除命令打印出来,但是不执行,这样就可以很容易的知道底层是如何运行的
  • -r 循环的清除在import中引入的包
  • -x 打印出来执行的详细命令,其实就是-n打印的执行版本

go fmt

go fmt是gofmthttps://golang.org/cmd/gofmt/的上层一个包装的代码格式化命令工具

gofmt -w -l src 可以格式化整个项目

常用参数详解:

  • -l 显示那些需要格式化的文件
  • -w 把改写后的内容直接写入到文件中,而不是作为结果打印到标准输出。
  • -r 添加形如“a[b:len(a)] -> a[b:]”的重写规则,方便我们做批量替换
  • -s 简化文件中的代码
  • -d 显示格式化前后的diff而不是写入文件,默认是false
  • -e 打印所有的语法错误到标准输出。如果不使用此标记,则只会打印不同行的前10个错误。
  • -cpuprofile 支持调试模式,写入相应的cpufile到指定的文件

go run

go run命令会将编译参数中的命令源码文件,并把编译后的可执行文件存放到临时目录中

常用参数详解:

  • -n: 打印相关命令而不实际执行

go list

go list 列出指定的代码包的信息

常用参数详解:

  • -e 以容错模式加载和分析指定的代码包。命令模式如果加载或分析过程中遇到错误指挥在内部记录一下,而不会直接把错误信息打印出来
  • -json 把代码包的结构体实力用json样式打印出来

go test

go test 会自动读取源码目录下的*_test.go文件, 生成并运行测试用的可执行文件

常用参数详解:

  • -bench regexp 执行相应的benchmarks,例如 -bench=.
  • -cover 开启测试覆盖率
  • -run regexp 只运行regexp匹配的函数,例如 -run=Array 那么就执行包含有Array开头的函数
  • -v 显示测试的详细命令
  • -c 生成用于运行测试的可执行文件,但不执行它。
  • -i 安装/重新安装运行测试所需的依赖包,但不编译和运行测试代码
  • -o 执行用于运行测试的可执行文件。追加该标记不会影响测试代码的运行,除非同时追加标记 -c 或 -i

go tool

go 工具包

  • go tool fix . 用来修复以前老版本的代码到新版本
  • go tool vet directory|files 用来分析当前目录的代码是否都是正确的代码
  • go tool vet –help 查看帮助
  • go tool pprof
  • go tool cgo
  • go tool 查看其它命令
  • go vet 只在一个单独的包内可用,不能使用flag选项(来激活指定的检测)
  • go tool vet 可用于文件和目录。目录递归遍历来找到包。

go doc

查看相应package的文档

go get golang.org/x/tools/cmd/godoc 安装godoc

godoc -http=:8080 浏览器中查看http://127.0.0.1:8080

godoc net/http 查看一个包

godoc fmt Printf 查看包中的一个函数

godoc -src fmt Printf 查看包中函数代码

go generate

通过分析源码中特殊的注释,然后执行相应的命令

例如使用yacc来生成代码

go tool yacc -o gopher.go -p parser gopher.y

-o 输出的文件名 -p package名称

可以在当然目录的任意一个xxx.go文件里面的任意位置增加一行如下的注释:

//go:generate go tool yacc -o gopher.go -p parser gopher.y

注意: //go:generate 是没有空格的, 这样就可以用go generate来触发这个命令

go get golang.org/x/tools/cmd/goyacc 安装goyacc

参考