go build 命令从入门到放弃

Go 提供了好几个重要的命令,都在 $GOROOT/pkg/tool/<平台相关目录> 中。其中 go build 算是最常用的一个命令之一。

go build 命令从入门到放弃
Go 语言常见命令

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

如果是普通包,当你执行 go build 之后,它不会产生任何文件。如果你需要在 $GOPATH/pk g下生成相应的文件,那就得执行 go install。

如果是 main 包,当你执行 go build 之后,它就会在当前目录下生成一个可执行文件。如果你需要在 $GOPATH/bin 下生成相应的文件,需要执行 go install,或者使用 go build -o 路径/xttblog.exe。

如果某个项目文件夹下有多个文件,而你只想编译某个文件,就可在 go build 之后加上文件名,例如 go build xttblog.go;go build 命令默认会编译当前目录下的所有 go 文件。

我们也可以指定编译输出的文件名。我们可以指定 go build -o xttblog.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 文件,其它系统命名后缀文件全部忽略。

go build 参数的介绍

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

如果我们在执行 go build 命令时不后跟任何代码包,那么命令将试图编译当前目录所对应的代码包。假设在代码包 xttblog 中只有库源码文件和测试源码文件,那么在执行 go build 之后,那么将不会在当前目录和项目的 pkg 目录中产生任何文件。

go build 还可以同时指定编译多个文件。

go build logging/xttblog.go logging/console_logger.go xttblog/log_manager.go logging/tag.go

但是,使用这种方法会有一个限制。作为参数的多个 Go 源码文件必须在同一个目录中。也就是说,如果我们想用这种方法既编译 logging 包又编译 basic 包是不可能的。不过别担心,在需要的时候,那些被编译目标依赖的代码包会被 go build 命令自动的编译。例如,如果有一个导入路径为 app 的代码包,同时依赖了 logging 包和 basic 包。那么在执行 go build app 的时候,该命令就会自动的在编译 app 包之前去检查 logging 包和 basic 包的编译状态。如果发现它们的编译结果文件不是最新的,那么该命令就会先去的编译这两个代码包,然后再编译 app 包。

go build 命令从入门到放弃

: » go build 命令从入门到放弃

原创文章,作者:jamestackk,如若转载,请注明出处:https://blog.ytso.com/252886.html

(0)
上一篇 2022年5月5日
下一篇 2022年5月5日

相关推荐

发表回复

登录后才能评论