go命令

翻译一遍^_^

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
build       compile packages and dependencies
clean remove object files
doc show documentation for package or symbol
env print Go environment information
fix run go tool fix on packages
fmt run gofmt on package sources
generate generate Go files by processing source
get download and install packages and dependencies
install compile and install packages and dependencies
list list packages
run compile and run Go program
test test packages
tool run specified go tool
version print Go version
vet run go tool vet on packages

// Additional help topics:
c calling between Go and C
buildmode description of build modes
filetype file types
gopath GOPATH environment variable
importpath import path syntax
packages description of package lists
testflag description of testing flags
testfunc description of testing functions

build(编译包和依赖)

编译包及其依赖但是不安装(install).
如果包参数是一列,把它们当作一个包的源码文件处理
如果是main包,编译出结果幷保存,否则只编译(相当于检查能否编译)
-o 指定输出文件名.如果没有指定,不是main包取package.+第一个文件名,如果是main包,取第一个文件名.(go build init.go main.go => init)
-i 按装其依赖包

  1. 用法
    1
    go build [-o output] [-i] [build flags] [packages]
  1. 参数(build, clean, get, install, list, run, test 共享)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    -a  强行对所有涉及到的代码包(包含标准库中的代码包)进行重新构建。
    -n 打印编译期间所用到的其它命令,但是并不真正执行它们。
    -p n
    指定编译过程中执行各任务的并行数量(确切地说应该是并发数量)。在默认情况下,该数量等于CPU的逻辑核数。但是在darwin/arm平台(即iPhone和iPad所用的平台)下,该数量默认是1
    -race
    开启竞态条件的检测。不过此标记目前仅在linux/amd64、freebsd/amd64、darwin/amd64和windows/amd64平台下受到支持。
    -v 打印出那些被编译的代码包的名字。
    -work
    打印出编译时生成的临时工作目录的路径,并在编译结束时保留它。在默认情况下,编译结束时会删除该目录。
    -x 打印编译期间所用到的其它命令。注意它与-n标记的区别。
    -buildmode mode
    详情查看 'go help buildmode'
    -linkshared
    buildmode=shared下的链接库
    -compiler name
    指定编译器名称(gccgo or gc).默认gc
    -gccgoflags 'arg list'
    给gccgo编译器调用的参数
    -gcflags 'arg list'
    给gc编译器调用的参数
    -installsuffix suffix
    为了使当前的输出目录与默认的编译输出目录分离,可以使用这个标记。此标记的值会作为结果文件的父目录名称的后缀。其实,如果使用了-race标记,这个标记会被自动追加且其值会为race。如果我们同时使用了-race标记和-installsuffix,那么在-installsuffix标记的值的后面会再被追加_race,并以此来作为实际使用的后缀。
    -ldflags 'flag list'
    此标记用于指定需要传递给go tool link命令的标记的列表。
    -asmflags 'flag list'
    此标记可以后跟另外一些标记,如-D、-I、-S等。这些后跟的标记用于控制Go语言编译器编译汇编语言文件时的行为。
    -tags 'tag list'
    此标记用于指定在实际编译期间需要受理的编译标签(也可被称为编译约束)的列表。这些编译标签一般会作为源码文件开始处的注释的一部分.
    -toolexec 'cmd args'
    此标记可以让我们去自定义在编译期间使用一些Go语言自带工具(如vet、asm等)的方式。

列表参数接收以空格间隔的列表.参数-数量可1可2
更多参见 go help packages,go help gopath,go help c,go install, go get, go clean

clean(移除对象文件)

  1. 用法
    1
    go clean [-i] [-r] [-n] [-x] [build flags] [packages]

执行go clean命令会删除掉执行其它命令时产生的一些文件和目录,包括:

  1. 在使用go build命令时在当前代码包下生成的与包名同名或者与Go源码文件同名的可执行文件。在Windows下,则是与包名同名或者Go源码文件同名且带有“.exe”后缀的文件。
  2. 在执行go test命令并加入-c标记时在当前代码包下生成的以包名加“.test”后缀为名的文件。在Windows下,则是以包名加“.test.exe”后缀为名的文件。我们会在后面专门介绍go test命令。
  3. 如果执行go clean命令时带有标记-i,则会同时删除安装当前代码包时所产生的结果文件。如果当前代码包中只包含库源码文件,则结果文件指的就是在工作区的pkg目录的相应目录下的归档文件。如果当前代码包中只包含一个命令源码文件,则结果文件指的就是在工作区的bin目录下的可执行文件。
  4. 还有一些目录和文件是在编译Go或C源码文件时留在相应目录中的。包括:“_obj”和“_test”目录,名称为“_testmain.go”、“test.out”、“build.out”或“a.out”的文件,名称以“.5”、“.6”、“.8”、“.a”、“.o”或“.so”为后缀的文件。这些目录和文件是在执行go build命令时生成在临时目录中的。如果你忘记了这个临时目录是怎么回事儿,可以再回顾一下前面关于go build命令的介绍。临时目录的名称以go-build为前缀。
  5. 如果执行go clean命令时带有标记-r,则还包括当前代码包的所有依赖包的上述目录和文件。

doc(展示包文档)

  1. 用法

    1
    2
    3
    -c	加入此标记后会使go doc命令区分参数中字母的大小写。默认情况下,命令是大小写不敏感的。
    -cmd 加入此标记后会使go doc命令同时打印出main包中的可导出的程序实体(其名称的首字母大写)的文档。默认情况下,这部分文档是不会被打印出来的。
    -u 加入此标记后会使go doc命令同时打印出不可导出的程序实体(其名称的首字母小写)的文档。默认情况下,这部分文档是不会被打印出来的。
  2. godoc 有更丰富的功能

env(打印go环境信息)

fix(对包运行go tool fix)

install(编译幷安装)

相比较go build,除了编译还多了安装步骤.
没有 -o 指输出文件的操作
在 GOPATH 有多个路径的时候,如果是安装命令源码 (main 包),要设置环境变量GOBIN.安装库源码的时候会默认安装到第一个GOPATH下的 pkg 下的${GOOS}_${GOARCH}文件夹. (go get 类似)
标准库的.a静态文件会被安装到GOROOT的pkg中

get(下载并安装)

从 VCS(version control system) 中下载并安装
可以通过在仓库中设置go标签或分支,只能检出对应版本代码,否则master
-u 强制更新,重新下载拉取
通过导入注释,自定义导入url package analyzer // import "hypermind.cn/talon/analyzer"
html 导入标签 <meta name="go-import" content="import-prefix vcs repo-root">,
如: <meta name="go-import" content="hypermind.cn/talon git https://github.com/hyper-carrot/talon">

  1. 特有标签
    1
    2
    3
    4
    5
    6
    -d	让命令程序只执行下载动作,而不执行安装动作。
    -f 仅在使用-u标记时才有效。该标记会让命令程序忽略掉对已下载代码包的导入路径的检查。如果下载并安装的代码包所属的项目是你从别人那里Fork过来的,那么这样做就尤为重要了。
    -fix 让命令程序在下载代码包后先执行修正动作,而后再进行编译和安装。
    -insecure 允许命令程序使用非安全的scheme(如HTTP)去下载指定的代码包。如果你用的代码仓库(如公司内部的Gitlab)没有HTTPS支持,可以添加此标记。请在确定安全的情况下使用它。
    -t 让命令程序同时下载并安装指定的代码包中的测试源码文件中依赖的代码包。
    -u 让命令利用网络来更新已有代码包及其依赖包。默认情况下,该命令只会从网络上下载本地不存在的代码包,而不会更新已有的代码包。