golang 标准命令

白也 · · 734 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

go源码文件:

  1. 命令源码文件:总是作为可执行的程序的入口

  2. 库源码文件:一般用于集中放置各种待被使用的程序实体(全局常量、全局变量、接口、结构体、函数等等)

go build

go build: 用于编译指定的源码文件或者代码包以及它们的依赖包,默认不会编译目标代码包所依赖的那些代码包。当然如果依赖的代码包的归档文件不存在,后者源码文件有了变化,那它还是会被编译。

go build

  1. 在编译只包含库源码文件的代码包时,只会检查性的编译,不会输出任何结果文件

  2. 在编译命令源码文件时,生成可执行包

go build 既不能编译包含多个命令源码文件的代码包,也不能同时编译多个命令源码文件。因为如果把多个命令源码文件作为一个整体看待,那么每个文件中的main函数都属于重名函数,在编译时会抛出重复定义错误。

go build 常用标记:

  1. -a: 强行对所有设计到的代码包进行重新构建,不但目标代码包总会被编译,依赖的代码包也会被编译,即使依赖的是标准库中的代码包也是如此;
  2. -n: 打印编译期间所用到的其他命令,但是并不真正执行它们
  3. -p n: 制定编译过程中执行各任务的并行数量。
  4. -race: 开启竞态条件的检测。
  5. -v: 打印出那些被编译的代码包的名字
  6. -work: 打印出编译时生成的临时工作目录的路径,并在编译结束时保留。
  7. -x: 打印编译期间所用到的其他命令。可以看到具体执行了那些操作

go install

go install: 用于编译并安装指定的代码包及它们的依赖包。当指定的代码包的依赖包还没有被编译和安装时,该命令会先去处理依赖包。

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

go install 安装代码包:

  1. 如果为库源码文件,会把编译后的结果文件保存在源码文件所在工作目录pkg下。对于仅包含库源码文件的代码包来说,这个结果文件就是对应的代码包归档文件,也叫静态链接库,以.a结尾

  2. 如果为命令源码文件,将生成的二进制文件放到当前目录或GOBIN目录下

go get

go get: 自动从主流公用代码仓库下载代码包,并把它们安装到环境变量GOPATH包含的第一个工作区的相应目录中,如果存在环境变量GOBIN,那么仅包含命令源码文件的代码包会被安装到GOBIN指向的那个目录

go get 标记:

  1. -d: 让命令只执行下载动作,而不执行安装动作
  2. -f: 仅在使用-u标记时才有效。该标记会让命令程序忽略对已下载代码包的导入路径的检查。
  3. -fix: 让命令程序在下载代码包之后执行修正动作,而后进行编译和安装
  4. -insecure: 允许通过非安全的网络协议下载和安装代码包。eg: http
  5. -t: 同时下载测试所需代码包
  6. -u: 下载并安装代码包,不论工作区中是否已存在它们。

go get突出特性智能下载;

  1. 在使用它检出或更新代码包之后,它会寻找与本地已安装go语言的版本相对应的标签或分支。如:本地安装Go语言版本1.x,那么go get命令会在该代码包的远程仓库中寻找名为“go1”的标签或者分支。如果找到,则将本地代码包的版本切换到此标签或者分支。如果没有找到,则将本地代码包的版本切换到主干的最新版本。
  2. go get通过git fetch将所有远程分支更新到本地,而后用git show-ref命令列出本地与远程仓库中记录的代码包的所有分支和标签。
  3. 最后,当确定没有名为"go1",go get使用git checkout origin/master命令将代码包版本切换到主干最新版本。

go clean

go clean: 删除掉执行其他命令时产生的一些文件和目录

包括:

  1. 使用go build 命令在当前包下生成的与包名同名或者与go源码文件同名的可执行文件

  2. 执行go test命令并加入-c标记时在当前代码包下生成的以包名为后缀的“.test”文件

  3. 如果执行go clean命令时带有-i,则会同时删除安装当前代码包时所产生的结果文件。如果当前代码包中只包含库源码文件,则结果文件指的就是在工作区的pkg目录的相应目录下的归档文件。如果当前代码包中只包含一个命令源码文件,则结果文件指的就是工作区的bin目录下的可执行文件。

  4. 还有一些目录和文件在编译Go或C源码文件时留在相应目录中的。

  5. 如果执行go clean命令时带有-r,则包括当前代码包的所有依赖包的上述目录和文件

go doc

go doc:可以打印赋与Go语言程序实体(程序实体:变量、常量、函数、结构体以及接口)的文档。

go doc 标识符:

  1. -c: 加入此标识符会使go doc命令区分参数重字母的大小写。
  2. -cmd: 加入此标识符,会使go doc命令同时打印出main包中的可导出的程序实体的文档。默认情况下,这部分文档不会被打印出来的
  3. -u: 加入此标记后,会是go doc命令同时打印出不可导出的程序实体的文档。默认情况下,这部分文档是不会被打印出来的

godoc

godoc: 一个很强大的工具,用于展示指定代码包的文档。

>> godoc fmt
PACKAGE DOCUMENTATION

package fmt
import "fmt"

    Package fmt implements formatted I/O with functions analogous to C's
    printf and scanf. The format 'verbs' are derived from C's but are
    simpler.
    Printing
    The verbs:
    General:
    ........
>> godoc -src fmt   // 查看文档和源码
>> godoc -http=:6060      // 启动端口6060的文档web服务器
复制代码

go run

go run 编译并运行命令源码文件。只接受一个go源码文件以及若干个库源码文件作为参数,且不接受代码包以及不能接受测试源码文件。也不允许多个命令源码文件作为参数,即使它们在同一个代码包中也是如此。在执行时会检查源码文件的类型。如果包含多个或者没有源码文件,那么go run命令只会打印错误提示信息并退出,而不会继续运行

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

go run 命令标识符

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

go test

go test: 用于对go语言编写的程序进行测试。这种测试一代码包为单位。

go test 命令标记符:

  1. -c: 生成用于运行测试的可执行文件,但不执行它。
  2. -i: 安装/重新安装运行测试所需的依赖包,但不编译和运行测试代码
  3. -o: 执行用于运行测试的可执行文件。追加该标记不会影响测试代码的运行,除非同时追加标记 -c 或 -i

go list

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

go list 标识符:

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

>> go list -e net
net
>> go list -json net
{
	"Dir": "/Users/wan/go/src/net",
	"ImportPath": "net",
	"Name": "net",
	"Doc": "Package net provides a portable interface for network I/O, including TCP/IP, UDP, domain name resolution, and Unix domain sockets.",
	"Target": "/Users/wan/go/pkg/darwin_amd64/net.a",
	"Root": "/Users/wan/go",
	"Match": [
		"net"
	],
    ......
}复制代码

go vet 和 go tool vet 

vet: 代码静态检查发现可能的bug或可疑的构造;是go tool套件的一部分,和go编译器一起发布;在编译阶段和运行阶段发现bug;

go vet: 只在一个单独的包内可用,不能使用flag选项(来激活指定的检测)

go tool vet: 可用于文件和目录。目录递归遍历来找到包。

>> go vet file.go
>> go tool vet dir/file or file.go复制代码

可通过  go tool vet --help 查询文档





有疑问加站长微信联系(非本文作者)

本文来自:掘金

感谢作者:白也

查看原文:golang 标准命令

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

734 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传