Golang 本身就是一个程序,包含了编译器以及一些辅助指令。
go run 试运行go run 会快速执行指定的 .go 源码文件,包括:编译一个临时可执行文件并运行,但不会生成二进制文件,常用于试运行代码。
go run main.go
go build 编译
go build 指令用于编译一个 Golang 源码,并生成可执行文件。go build 可以编译一个项目,也可指仅编译指定的若干个源码文件。
-
当
GO111MODULE="off"
时,会到 $GOPATH/src 路径下寻找项目的源码文件和第三方依赖包。先递归寻找 main.go 所依赖的包,以及依赖的依赖,直至最底层的包。这里可以是深度优先遍历也可以是宽度优先遍历。如果发现有循环依赖,就会直接退出,这也是经常会发生的循环引用编译错误。 -
当
GO111MODULE="on"
时,直接从 go.mod 文件中查询依赖并下载到 $GOPATH/pkg/mod 路径下。
Golang 的源码主要分为三类:
- cmd 命令源码:Golang 程序入口。
- pkg 库源码:是可公开的各种函数、接口等。go build 只包含库源码的 Package 时,只会做检查性的编译,而不会输出任何结果文件。也就是说,当我们仅编译库源码文件时,是不会生成 .a 静态库文件的。
- test 测试源码:go build 不会编译测试源码。
go build [-o output] [-i] [build flags] [packages]
- -o:只在编译单个包的时候出现,它指定输出的可执行文件名。
- -i:会安装编译目标所依赖的包,安装是指生成与代码包相对应的 .a 文件,即静态库文件,并且放置到当前工作区的 pkg 目录下,且库文件的目录层级和源码层级一致。
build flags 参数如下表(注:build、clean、get、install、list、run、test 这些命令共用一套):
打印整个编译链接的运行过程:
go build -v -x -work -o bin/hello src/main.go
- -v:打印所编译过的包名字。
- -x:打印编译期间所执行的命令。
- -work:打印编译期间生成的临时文件路径,并且编译完成之后不会被删除。
go install 指令会做两件事情:
- 执行 go build 指令。
- 安装编译后的结果文件到指定目录。如果是可执行文件,则放到 $GOPATH/bin 目录下;如果只是库源码,则会编译生成 .a 文件,并存放到 $GOPATH/pkg 目录下。
go get 会做两件事情:
- 从远程下载需要用到的包。
- 执行 go install 指令。
$ go get golang.org/x/tools/cmd/goimports
- 查看可下载版本
go list -m -versions github.com/gogf/gf
- 拉取最新的版本
go get golang.org/x/text@latest
- 拉取 master 分支的最新 commit
go get golang.org/x/text@master
- 拉取 tag 为 v0.3.2 的 commit
go get golang.org/x/text@v0.3.2
- 拉取 hash 为 342b231 的 commit,最终会被转换为 v0.3.2
go get golang.org/x/text@342b2e
- 指定版本拉取,拉取 v3 版本
go get github.com/smartwalle/alipay/v3
- 更新
go get -u github.com/spf13/cobra/cobra
go test 测试
go test 用于执行单元测试或压力测试。
go fmt 格式化源代码Golang 程序代码的大部分格式问题都可以通过 go fmt 指令来解决。go fmt 会自动格式化代码,保证所有的 Go 代码与官方推荐的格式保持一致,所有格式有关问题,都以 go fmt 的执行结果为准。所以,建议在提交代码库之前先运行一下这个命令。