Merge pull request #25400 from wxy/20220414-My-favorite-build-options-for-Go

RP:published/20220414 My favorite build options for Go.md
This commit is contained in:
Xingyu.Wang 2022-04-30 17:27:10 +08:00 committed by GitHub
commit adf164d8be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3,25 +3,24 @@
[#]: author: "Gaurav Kamathe https://opensource.com/users/gkamathe" [#]: author: "Gaurav Kamathe https://opensource.com/users/gkamathe"
[#]: collector: "lkxed" [#]: collector: "lkxed"
[#]: translator: "lkxed" [#]: translator: "lkxed"
[#]: reviewer: " " [#]: reviewer: "wxy"
[#]: publisher: " " [#]: publisher: "wxy"
[#]: url: " " [#]: url: "https://linux.cn/article-14525-1.html"
我最喜欢的 Go 构建选项 我最喜欢的 Go 构建选项
====== ======
这些方便的 Go 构建选项可以帮助你更好地理解 Go 的编译过程。
![GitHub 推出“开源星期五”][1] > 这些方便的 Go 构建选项可以帮助你更好地理解 Go 的编译过程。
(图源 Opensource.com) ![](https://img.linux.net.cn/data/attachment/album/202204/30/172121exam5k8vx45kzk7p.jpg)
学习一门新的编程语言最令人欣慰的部分之一,就是最终运行一个可执行文件,并获得符合预期的输出。当我开始学习 Go 这门编程语言时,我先是阅读一些样本程序来熟悉语法,然后是尝试写一些小的测试程序。随着时间的推移,这种方法帮助我熟悉了编译和构建程序的过程。 学习一门新的编程语言最令人欣慰的部分之一,就是最终运行一个可执行文件,并获得预期的输出。当我开始学习 Go 这门编程语言时,我先是阅读一些示例程序来熟悉语法,然后是尝试写一些小的测试程序。随着时间的推移,这种方法帮助我熟悉了编译和构建程序的过程。
Go 的构建选项提供了方法来更好地控制构建过程。它们还可以提供额外的信息,帮助把这个过程分成更小的部分。在这篇文章中,我将演示我所使用的一些选项。注意:我使用的 build 和 compile 这两个词是同一个意思。 Go 的构建选项提供了更好地控制构建过程的方法。它们还可以提供额外的信息,帮助把这个过程分成更小的部分。在这篇文章中,我将演示我所使用的一些选项。注意:我使用的<ruby>构建<rt>build</rt></ruby>”和“<ruby>编译<rt>compile</rt></ruby>这两个词是同一个意思。
### 开始使用 Go ### 开始使用 Go
我使用的 Go 版本是 1.16.7。但是,这里给出的命令应该也能在最新的版本上运行。如果你没有安装 Go你可以从 [Go 官网][2] 上下载它,并按照说明进行安装。你可以通过打开一个提示符命令,并键入下面的命令来验证你所安装的版本: 我使用的 Go 版本是 1.16.7。但是,这里给出的命令应该也能在最新的版本上运行。如果你没有安装 Go你可以从 [Go 官网][2] 上下载它,并按照说明进行安装。你可以通过打开一个命令提示符,并键入下面的命令来验证你所安装的版本:
``` ```
$ go version $ go version
@ -33,7 +32,7 @@ $ go version
go version go1.16.7 linux/amd64 go version go1.16.7 linux/amd64
``` ```
### Go 程序的基本编译和执行 ### 基本的 Go 程序的编译和执行方法
我将从一个在屏幕上简单打印 “Hello World” 的 Go 程序示例开始,就像下面这样: 我将从一个在屏幕上简单打印 “Hello World” 的 Go 程序示例开始,就像下面这样:
@ -79,7 +78,7 @@ hello.go
### 更多细节 ### 更多细节
运行我的程序时,上面的命令使我如鱼得水,不费吹灰之力。然而,如果你想知道 Go 在编译这些程序的过程中做了什么Go 提供了一个 `-x` 选项,它可以打印出 Go 为产生可执行文件所做的一切。 上面的命令就像一阵风一样,一下子就运行完了我的程序。然而,如果你想知道 Go 在编译这些程序的过程中做了什么Go 提供了一个 `-x` 选项,它可以打印出 Go 为产生这个可执行文件所做的一切。
简单看一下你就会发现Go 在 `/tmp` 内创建了一个临时工作目录,并生成了可执行文件,然后把它移到了 Go 源程序所在的当前目录。 简单看一下你就会发现Go 在 `/tmp` 内创建了一个临时工作目录,并生成了可执行文件,然后把它移到了 Go 源程序所在的当前目录。
@ -104,7 +103,8 @@ nDueg0kBjIygx25rYwbK/W-eJaGIOdPEWgwC6o546 \
mv $WORK/b001/exe/a.out hello mv $WORK/b001/exe/a.out hello
rm -r $WORK/b001/ rm -r $WORK/b001/
``` ```
这有助于解决程序运行后,在当前目录下没有生成可执行文件的问题。使用 `-x` 显示可执行文件确实在 `/tmp` 工作目录下创建并被执行。然而,与 `build` 命令不同的是,可执行文件并没有移动到当前目录,这使得看起来没有可执行文件被创建。
这有助于解决在程序运行后却在当前目录下没有生成可执行文件的谜团。使用 `-x` 显示可执行文件确实在 `/tmp` 工作目录下创建并被执行了。然而,与 `build` 命令不同的是,可执行文件并没有移动到当前目录,这使得看起来没有可执行文件被创建。
``` ```
$ go run -x hello.go $ go run -x hello.go
@ -189,9 +189,9 @@ searching for runtime.a in /usr/lib/golang/pkg/linux_amd64/runtime.a
现在我已经解释了 Go 程序的编译过程,接下来,我将演示 Go 如何通过在实际的 `build` 命令之前提供 `GOOS``GOARCH` 这两个环境变量,来允许你构建针对不同硬件架构和操作系统的可执行文件。 现在我已经解释了 Go 程序的编译过程,接下来,我将演示 Go 如何通过在实际的 `build` 命令之前提供 `GOOS``GOARCH` 这两个环境变量,来允许你构建针对不同硬件架构和操作系统的可执行文件。
这有什么用呢?举个例子,你会发现为 ARMarch64架构制作的可执行文件不能在 Intelx86_64架构上运行而且会产生一个 Exec 格式错误。 这有什么用呢?举个例子,你会发现为 ARMarch64架构制作的可执行文件不能在英特尔x86_64架构上运行而且会产生一个 Exec 格式错误。
下面的这些选项使得生跨平台的二进制文件变得小菜一碟: 下面的这些选项使得生跨平台的二进制文件变得小菜一碟:
``` ```
$ GOOS=linux GOARCH=arm64 go build hello.go $ GOOS=linux GOARCH=arm64 go build hello.go
@ -206,11 +206,11 @@ $ uname -m
x86_64 x86_64
``` ```
你可以阅读我之前的博文,了解更多我在 [使用 Go 进行交叉编译][3] 方面的经验。 你可以阅读我之前的博文,以更多了解我在 [使用 Go 进行交叉编译][3] 方面的经验。
### 查看底层汇编指令 ### 查看底层汇编指令
源代码并不会直接转换为可执行文件,尽管它生成了一种中间汇编格式,然后最终被汇编为可执行文件。在 Go 中,这被映射为一种中间汇编格式,而不是底层硬件汇编指令。 源代码并不会直接转换为可执行文件,尽管它生成了一种中间汇编格式,然后最终被组装为可执行文件。在 Go 中,这被映射为一种中间汇编格式,而不是底层硬件汇编指令。
要查看这个中间汇编格式,请在使用 `build` 命令时,提供 `-gcflags` 选项,后面跟着 `-S`。这个命令将会显示使用到的汇编指令: 要查看这个中间汇编格式,请在使用 `build` 命令时,提供 `-gcflags` 选项,后面跟着 `-S`。这个命令将会显示使用到的汇编指令:
@ -246,7 +246,7 @@ TEXT main.main(SB) /test/hello.go
### 分离二进制文件以减少其大小 ### 分离二进制文件以减少其大小
Go 的二进制文件通常比较大。例如, 一个简单的 Hello World 程序将会产生一个 1.9M 大小的二进制文件。 Go 的二进制文件通常比较大。例如, 一个简单的 Hello World 程序将会产生一个 1.9M 大小的二进制文件。
``` ```
$ go build hello.go $ go build hello.go
@ -287,7 +287,7 @@ via: https://opensource.com/article/22/4/go-build-options
作者:[Gaurav Kamathe][a] 作者:[Gaurav Kamathe][a]
选题:[lkxed][b] 选题:[lkxed][b]
译者:[lkxed](https://github.com/lkxed) 译者:[lkxed](https://github.com/lkxed)
校对:[校对者ID](https://github.com/校对者ID) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出