文章

go-常用命令

初始化项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 初始化 Go Modules, 创建 go.mod
go mod init <项目名>
<项目名>: 一般用当前项目的文件夹

eg:
go mod init go_gin


# 下载所有依赖, 创建 go.sum:
go mod tidy

# 验证依赖:你可以使用以下命令来验证所有依赖是否正确安装
go mod verify

# 编译 二进制文件
go build

go run filename.go

1
2
3
4
5
6
编译源文件,并运行可执行文件

-n      打印相关命令而不实际执行
-x      执行且可以看到执行过程中的命令
-work   打印临时工作目录的位置: WORK=/tmp/go-build2205526461

go build filename.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
1. 直接编译: 
编译源文件,并保留可执行的二进制文件
会自动根据当前环境生成.exe、二进制可执行

2. 生成指定文件名
go build -o [二进制文件名] [main.go]


3.指定环境编译
比如:在系统环境: amd64 linux 上运行: GOOS=linux GOARCH=amd64 go build sayHello.go

参数: 具体的说明可通过输入命<go help environment>查看 
GOARCH  硬件体系架构(amd64, 386, arm, ppc64等)
GOOS    操作系统(darwin, freebsd, linux, windows)
CGO_ENABLED:代表是否开启CGO,1表示开启,0表示禁用。由于CGO不能支持交叉编译,所以需要禁用


编译 Linux 64位可执行程序:
X86     CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
ARM     CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build main.go

编译Windows  64位可执行程序:
X86     CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
ARM     CGO_ENABLED=0 GOOS=windows GOARCH=arm64 go build main.go

编译 MacOS 64位可执行程序:
X86     CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
ARM     CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build main.go


问题: 没有指定环境二进制文件在其他环境中无法运行
在mac本上build sayHello.go 想在linux系统上运行
出现了错误提示:
    cannot execute binary file
    或者
    -bash: ./sayHello: 无法执行二进制文件
虽然说golang可以直接生成可运行的二进制文件,但是编译的时候要加命令

为什么 CGO_ENABLED=1默认?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

1. CGO_ENABLED=1 我相信是当前的默认值,这意味着它取决于 GLIBC,它可以在更新和发行版之间进行重大更改
2. CGO_ENABLED=0 是创建静态独立二进制文件的解决方法,为什么这不是默认值?

通常,在CGO_ENABLED=1构建操作系统上运行时,会导致更快、更小的构建和运行时因为它可以动态加载主机操作系统的本机库(例如gLibc,DNS 解析器等)。这是当地快速发展的理想选择。对于部署,CGO_ENABLED=1可能不切实际甚至不可能在考虑部署托管操作系统时。

如果您纯粹使用标准库,则它们可能不一定需要启用 CGO。在某些标准库中,如果使用纯 Go 版本(CGO_ENABLED=1) 或启用 CGO 的版本,行为会有所不同:

. net:请参阅 DNS名称解析
. 操作系统/用户:
    . CGO_ENABLED=1使用本机操作系统 (例如在 Linux上nsswitch)进行ID 查找;
    . CGO_ENABLED=0使用基本的 Go 实现 (例如从 读取/etc/passwd) -不包括主机可能知道的其他ID 注册表

## 部署
虽然 CGO ENABLED=1 二进制文件的大小可能较小,但它也依赖于提供主机操作系统。比较 Docker 镜像:
    a. ubuntu:20.04是 73.9MB (glibc:GNU-libc
    b. alpine:3.12.1是 5.57MB ( muslibc)
所以添加一个操作系统(即使是最小的)会增加这个额外的负担。alpine它的最小尺寸看起来很有吸引力 - 但它libc可能与依赖glibc.

CGO ENABLED=0 然而,非常适合临时docker 镜像部署因为不需要捆绑主机操作系统但是,如果您的应用程序导入带有 C 代码的包 (例如go-sqlite3),那么您的构建必须启用 CGO.
 

go build编译时的附加参数

|附加参数|备 注| |—-|—–| |-v | 编译时显示包名 | |-p n | 开启并发编译,默认情况下该值为 CPU 逻辑核数 | |-a | 强制重新构建 | |-n | 打印编译时会用到的所有命令,但不真正执行 | |-x | 打印编译时会用到的所有命令 | |-race| 开启竞态检测 |

格式化输出

1
gofmt -w main.go
本文由作者按照 CC BY 4.0 进行授权