编译
一步编译: gcc -o hello.exe code.c
分步编译:
gcc -E hello.c -o hello.i
gcc -S hello.i -o hello.s
gcc -c hello.s -o hello.o
gcc hello.o -o hello.exe
-E 预处理,去掉注释 头文件展开 宏定义展开条件编译
-S 预处理和编译,检查语法,将源码文件转成汇编语言
-c 汇编,将汇编语言转成二进制语言
# 将go语言程序系那是为汇编代码
go build -gcflags "-N -l"
go tool objdump -s 'main.Demo' -S ./src
Go语言本身支持使用CGO与C语言混合编程
go build
编译项目,使其打包成可运行程序,配合参数可以进行交叉编译
标准格式
go build [-o output] [-i] [build flags] [packages]
-o 参数决定了编译后文件名称,例如我们要程序main.go编译后程序名为hello,我们可以执行以下命令
go build -o hello main.go
-i install 安装作为目标的依赖关系的包(用于增量编译提速),一般很少使用。
编译参数一般并不会添加,以下列举几个,详细信息可以使用go help build 获取
附加参数 备注
-v 编译时显示包名
-p n 开启并发编译,默认情况下该值为 CPU 逻辑核数
-a 强制重新构建
-n 打印编译时会用到的所有命令,但不真正执行
-x 打印编译时会用到的所有命令
packages
所编译的包名,如果不填写默认为编译当前路径下的入口文件,文件名称默认为当前文件夹名称
交叉编译
go语言向下支持C语言,可以在go语言中直接编写C语言代码
但是在编译时,必须支持C语言
Mac上编译Linux可执行二进制文件
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
Mac上编译Windows可执行二进制文件
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
Linux上编译Mac可执行二进制文件
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
Linux上编译Windows可执行二进制文件
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
Windows上编译Mac可执行二进制文件
SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build main.go
Windows上编译Linux可执行二进制文件
SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build main.go
交叉编译参数含义
CGO_ENABLED 是否使用cgo编译,0为不使用,1为使用,使用cgo进行交叉编译时需要编译机器安装对应的cgo程序
GOOS 目标操作系统标识,windows对应Windows操作系统exe可执行文件,darwin对应Mac可执行文件,linux对应Linux可执行文件,freebsd对应UNIX系统
GOARCH 目标可执行程序操作系统构架,包括 386,amd64,arm
go build 后接所编译程序的入口文件
go test
Go语言自带的测试工具,会自动读取源码目录下面名为 *_test.go 的文件,生成并运行测试用的可执行文件
原则
文件名必须是 _test.go 结尾的,这样在执行 go test 的时候才会执行到相应的代码
必须 import testing 这个包
可执行测试
原则
所有的测试用例函数必须是 Test 开头
测试用例会按照源代码中写的顺序依次执行
测试函数 TestXxx() 的参数是 testing.T ,我们可以使用该类型来记录错误或者是测试状态
测试格式: func TestXxx (t *testing.T) , Xxx 部分可以为任意的字母数字的组合,但是首字母不能是小写字母[a-z]
函数中通过调用 testing.T 的 Error, Errorf, FailNow, Fatal, FatalIf 方法,说明测试不通过,调用 Log 方法用来记录测试的信息。
package main
/*
#include "stdio.h"
void xrint()
{
int a = 3;
printf("hello world1\n");
printf("hello world2\n");
}
*/
import "C"
func demo() {
//调用C语言函数
C.xrint()
}
func ma1in() {
demo()
}