这个命令主要用于编译代码。在包的编译过程中,若有必要,会同时编译与之相关联的包。

    • 如果是普通包,就像我们在1.2节中编写的mymath包那样,当你执行go build之后,它不会产生任何文件。如果你需要在$GOPATH/pkg下生成相应的文件,那就得执行go install。
    • 如果是main包,当你执行go build之后,它就会在当前目录下生成一个可执行文件。如果你需要在$GOPATH/bin下生成相应的文件,需要执行go install,或者使用go build -o 路径/a.exe。
    • 如果某个项目文件夹下有多个文件,而你只想编译某个文件,就可在go build之后加上文件名,例如go build a.go;go build命令默认会编译当前目录下的所有go文件。
    • 你也可以指定编译输出的文件名。例如1.2节中的mathapp应用,我们可以指定go build -o astaxie.exe,默认情况是你的package名(非main包),或者是第一个源文件的文件名(main包)。

    (注:实际上,package名在Go语言规范中指代码中“package”后使用的名称,此名称可以与文件夹名不同。默认生成的可执行文件名是文件夹名。)

    • go build会忽略目录下以“_”或“.”开头的go文件。
    • 如果你的源代码针对不同的操作系统需要不同的处理,那么你可以根据不同的操作系统后缀来命名文件。例如有一个读取数组的程序,它对于不同的操作系统可能有如下几个源文件: array_linux.go array_darwin.go array_windows.go array_freebsd.go

    go build的时候会选择性地编译以系统名结尾的文件(Linux、Darwin、Windows、Freebsd)。例如Linux系统下面编译只会选择array_linux.go文件,其它系统命名后缀文件全部忽略。

    参数的介绍

    • -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