1 编译工具
Go语言的工具链非常丰富,从获取源码、编译、文档、测试、性能分析,到源码格式化、源码提示、重构工具等应有尽有。 在Go语言中可以使用测试框架编写单元测试,使用统一的命令行即可测试及输出测试报告的工作。基准测试提供可自定义的计时器和一整套基准测试算法,能方便快速地分析一段代码可能存在的CPU耗用和内存分配问题。性能分析工具可以将程序的CPU耗用、内存分配、竞态问题以图形化方式展现出来。
<备注> 示例代码运行使用的Go发布版本:go version go1.15.4 linux/amd64。
1.1 编译(go build)
Go语言中使用 go build 命令将.go源码编译为可执行文件。go build 有很多种编译方法,如无参数编译、文件列表编译、指定包编译等,使用这些方法都可以输出可执行文件。
1.1.1 go build 无参数编译
1、进入到go源码目录下。
2、直接执行 go build 命令。示例如下:
lib.go
package main
import "fmt"
func pkgFunc() {
fmt.Println("call pkgFunc")
}
main.go
package main
import (
"fmt"
)
func main() {
//同包的函数
pkgFunc()
fmt.Println("Hello world")
}
(1)使用 tree -L 4 命令查看目录树关系如下:
(2)进入到存放go源码的 gobuild 目录下,执行命令:go build
(3)使用 ls 命令查看该目录下的文件。
gobuild lib.go main.go
go build 在编译开始时,会搜索当前目录下的go源文件。在该例中,go build 会找到 lib.go 和 main.go 这两个源文件。编译这两个文件后,生成当前目录名的可执行文件 gobuild,并放置于当前目录下。
(4)运行当前目录下的可执行文件:./gobuild
call pkgFunc
Hello world
1.1.2 go build + 文件列表
编译同目录下的多个源码文件时,可以在 go build 的后面提供多个文件名,go build 会编译这些源码,输出可执行文件,go build + 文件列表的格式如下:
go build file1.go file2.go ......
还是以上面的代码为例,使用 go build + 文件列表的方式编译:
// 方式1
$ go build main.go lib.go #选中需要编译的Go源码
$ ls
lib.go main main.go #这次的可执行文件变成了 main
$ ./main #执行 main 文件,得到期望的运行结果
call pkgFunc
Hello world
// 方式2
$ go build lib.go main.go #把 lib.go 放在文件列表的首位
$ ls
lib lib.go main main.go #这次编译得到的可执行文件变成了 lib
$ ./lib #执行 lib 文件,输出结果一样
call pkgFunc
Hello world
// 方式3
$ go build *.go #用通配符也是可以的
$ ls
lib lib.go main.go #得到的可执行文件 lib
<提示> 使用 “go build + 文件列表” 方式编译时,可执行文件默认选择文件列表中第一个Go源码文件作为可执行文件名。
如果需要指定输出可执行文件名,可以使用 “- o” 参数,参见下面的示例:
$ go build -o myexec main.go lib.go
$ ls
lib.go main.go myexec
$ ./myexec
call pkgFunc
Hello world
<注意> 使用 “go build + 文件列表” 编译方式时,文件列表中每个文件必须是同一个包的Go源码文件。也就是说,不能像C++语言那样,将所有工程的Go源码使用文件变量方式进行编译。编译复杂工程时,需要用“指定包编译”的方式。“go build + 文件列表” 方式更适合使用Go语言编写只有少量源码文件的项目。
1.1.3 go build + 包
“go build + 包” 在设置环境变量 GOPATH 后,可以直接根据包名进行编译,即使包内文件被增删也不影响编译指令。示例如下:
1. 代码位置及源码
相对于 GOPATH 的目录树关系如下:
$ tree -L 5 src
src
└── chapter11
└── goinstall
├── main.go
└── mypkg
└── mypkg.go3 directories, 2 files
main.go 代码如下:
package main
import (
"fmt"
"goinstall/mypkg" //在同一个项目下导入本地包
)
func main() {
mypkg.CustomPkgFunc()
fmt.Println(&