go build 命令从入门到放弃

业余杂谈 herman 62浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

Go 提供了好几个重要的命令,都在 $GOROOT/pkg/tool/<平台相关目录> 中。其中 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 包。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号1:xmtxtt(5000人已满),微信号2:codedq(5000人已满),微信号3:xttblog(超2800)。备注:“xttblog”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » go build 命令从入门到放弃