Skip to content

Latest commit

 

History

History
133 lines (110 loc) · 4.03 KB

2-4.md

File metadata and controls

133 lines (110 loc) · 4.03 KB

2.4 如何编译运行Go程序

如前面写的 hello.go 示例,我们写完Go程序后,可以通过go run hello.go运行这个go文件,但是要分发和部署一个Go应用的话,是不能用go run 这种方式来部署的,所以我们要把我们的应用项目或者模块进行build(构建)成二进制文件后部署到相应机器上。

创建Go项目

以 hello为示例

$ mkdir greeter
$ cd greeter
$ touch hello.go

把我们之前写的hello.go复制进去

package main

import "fmt"

func main() {
	fmt.Println("Hello World!")
}

然后执行go run hello.go确认运行可以正常输出Hello World!

创建Go 模块

Go 程序和库是围绕模块的核心概念构建的。模块包含有关程序使用的库以及要使用的这些库的版本的信息。Go模块创建可以使用go mod init 命令进行创建

$ go mod init greeter

执行成功后产生一下提示,go mod tidy以便在将来更改时更新此模块的要求,并且目录下会产生一个对应的go.mod文件

go: creating new go.mod: module greeter
go: to add module requirements and sums:
        go mod tidy

构建Go 二进制文件

模块文件创建成功后,我们可以在这个文件夹下执行go build 构建二进制文件,如果不指定参数,默认构建当前目录下所有的*.go文件,go build 常见编译选项:

参数	        说明
-o	        可执行文件名
-a	        强制重新编译所有包
-p	        并行编译所使用的CPU核数量
-v	        显示待编译包名字
-n	        仅显示编译命令,但不执行
-x	        显示正在执行的编译命令
-work	    显示临时工作目录,完成后不删除
-race	    启动数据竞争检查
-gcflags	编译器参数
-ldflags	链接器参数

gcflags 常见参数有:

参数	说明
-B	禁用越界检查
-N	禁用优化
-l	禁用内联
-u	禁用unsafe
-S	输出汇编代码
-m	输出优化信息

ldflags 常见参数有:

参数	说明
-s	禁用符号表
-w	禁用DRAWF调试信息
-X	设置字符串全局变量值
-H	设置可执行文件格式

咱们这个hello.go比较简单,使用go build即可

$ go build
$ ls
go.mod  greeter  hello.go

可以看到生成了一个greeter文件,执行./greeter

$ ./greeter
Hello World!

其他编译命令参考

如果需要调试,可以禁止编译优化,使用以下命令进行编译

go build -gcflags "all=-N -l"  -o greeter hello.go

去掉符号表和调试信息可以参考以下命令

go build -ldflags -s -w -o greeter hello.go

利用 -ldflags -X设置字符串全局变量值

每次发版都需要一个版本信息,通过配置文件或者人工修改版本号比较麻烦,而且容易忘记,恰好go编译的时候允许注入一个变量进去,然后使用CICD或者编译脚本,配合 -ldflags -X信息设置字符串全局变量值

看下简化的小例子

package main

import (
    "fmt"
)

var MinVersion string

func main() {
    fmt.Println(fmt.Sprintf("Version: %s", MinVersion))
}

保存上面的go文件后,使用以下命令进行编译,其中的版本号可以利用cicd或者git分支和版本进行动态设置,做到自动设置版本

go build -ldflags "-X 'main.MinVersion=1.0.0.1'" -o main.exe main.go

可选:安装Go程序(go install)

上面内容为如何构建我们Go程序的二进制可执行文件,可执行文件有助于分发、部署和测试,但它们还不能从其源目录之外执行,如果想在shell 或者其他语言中调用这个程序,我们可以使用go install 安装到系统中,执行go install 会把这个应用安装到$GOPATH/bin路径下,这样在这个环境中任何一个地方执行greeter都可以获得Hello World!

$ go install
$ ls $GOPATH/bin
dlv  gomodifytags  goplay  gopls  gotests  greeter  impl  staticcheck

链接