命令go env
用于打印Go语言的环境信息。其中的一些信息我们在之前已经多次提及,但是却没有进行详细的说明。在本小节,我们会对这些信息进行深入介绍。我们先来看一看go env
命令情况下都会打印出哪些Go语言通用环境信息。
表0-25 go env
命令可打印出的Go语言通用环境信息
名称 | 说明 |
---|---|
CGO_ENABLED | 指明cgo工具是否可用的标识。 |
GOARCH | 程序构建... |
分类目录归档:Go
命令go env
用于打印Go语言的环境信息。其中的一些信息我们在之前已经多次提及,但是却没有进行详细的说明。在本小节,我们会对这些信息进行深入介绍。我们先来看一看go env
命令情况下都会打印出哪些Go语言通用环境信息。
表0-25 go env
命令可打印出的Go语言通用环境信息
名称 | 说明 |
---|---|
CGO_ENABLED | 指明cgo工具是否可用的标识。 |
GOARCH | 程序构建... |
我们可以使用go tool pprof
命令来交互式的访问概要文件的内容。命令将会分析指定的概要文件,并会根据我们的要求为我们提供高可读性的输出信息。
在Go语言中,我们可以通过标准库的代码包runtime
和runtime/pprof
中的程序来生成三种包含实时性数据的概要文件,分别是CPU概要文件、内存概要文件和程序阻塞概要文件。下面我们先来分别介绍用于生成这三种概要文件的API的用法。
CPU概要文件
在介绍CPU概要文件的生成方法之前,我们先来简单了解一下CPU主频。CPU的主频,即CPU内核工作的时钟频率(CPU Clock Speed)。CPU的主频的基本单位是赫兹(Hz),但更多...
cgo也是一个Go语言自带的特殊工具。一般情况下,我们使用命令go tool cgo
来运行它。这个工具可以使我们创建能够调用C语言代码的Go语言源码文件。这使得我们可以使用Go语言代码去封装一些C语言的代码库,并提供给Go语言代码或项目使用。
在执行go tool cgo
命令的时候,我们需要加入作为目标的Go语言源码文件的路径。这个路径可以是绝对路径也可以是相对路径。但是,作者强烈建议在目标源码文件所属的代码包目录下执行go tool cgo
命令并以目标源码文件的名字作为参数。因为,go tool cgo
命令会在当前目录(也就是我们执行go tool cgo
命令的目录)中生成一个名为_o...
go fmt
命令会按照Go语言代码规范格式化指定代码包中的所有Go语言源码文件的代码,所有Go语言源码文件即包括命令源码文件、库源码文件和测试源码文件。注意,当代码包还有子代码包时,子代码包中的Go语言源码文件是不包含在内的。也就是说,go fmt
命令只会格式化被直接保存在指定代码包对应目录下的Go语言源码文件。
与go doc
命令和godoc
命令的关系类似,go fmt
命令是gofmt
命令的简单封装。go fmt
命令本身可以接受两个标记。标记-n
可以让命令程序仅打印出内部使用的gofmt
命令及其标记和参数而不真正执行它。标记-x
则会使命令程序既打印又执行这个命令。在go fmt
命令程序...
命令go fix
会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。这里所说的版本即Go语言的版本。代码包的所有Go语言源码文件不包括其子代码包(如果有的话)中的文件。修正操作包括把对旧程序调用的代码更换为对新程序调用的代码、把旧的语法更换为新的语法,等等。
这个工具其实非常有用。在编程语言的升级和演进的过程中,难免会对过时的和不够优秀的语法及标准库进行改进。这样的改进对于编程语言的向后兼容性是个挑战。我们在前面提到过向后兼容这个词。简单来说,向后兼容性就是指新版本的编程语言程序能够正确识别和解析用该编程语言的旧版本编写的程序和软件,以及在新版本的编程语言的运行时环境中...
命令go vet
是一个用于检查Go语言源码中静态错误的简单工具。与大多数Go命令一样,go vet
命令可以接受-n
标记和-x
标记。-n
标记用于只打印流程中执行的命令而不真正执行它们。-n
标记也用于打印流程中执行的命令,但不会取消这些命令的执行。示例如下:
hc@ubt:~$ go vet -n pkgtool
/usr/local/go/pkg/tool/linux_386/vet golang/goc2p/src/pkgtool/envir.go golang/goc2p/src/pkgtool/envir_test.go golang/goc2p/src/pkgtool/fpath....
go list
命令的作用是列出指定的代码包的信息。与其他命令相同,我们需要以代码包导入路径的方式给定代码包。被给定的代码包可以有多个。这些代码包对应的目录中必须直接保存有Go语言源码文件,其子目录中的文件不算在内。否则,代码包将被看做是不完整的。现在我们来试用一下:
hc@ubt:~$ go list cnet/ctcp pkgtool
cnet/ctcp
pkgtool
我们看到,在不加任何标记的情况下,命令的结果信息中只包含了我们指定的代码包的导入路径。我们刚刚提到,作为参数的代码包必须是完整的代码包。例如:
hc@ubt:~$ go list cnet pkgtool
can...
go test
命令用于对Go语言编写的程序进行测试。这种测试是以代码包为单位的。当然,这还需要测试源码文件的帮助。关于怎样编写并写好Go程序测试代码,我们会在本章的第二节加以详述。在这里,我们只讨论怎样使用命令启动测试。
go test
命令会自动测试每一个指定的代码包。当然,前提是指定的代码包中存在测试源码文件。关于测试源码文件方面的知识,在我的图书《Go并发编程实战》中有详细介绍。测试源码文件是名称以“_test.go”为后缀的、内含若干测试函数的源码文件。测试函数一般是以“Test”为名称前缀并有一个类型为“testing.T”的参数声明的函数.
现在,我们来测试goc2p项目中的几...
go doc
命令可以打印附于Go语言程序实体上的文档。我们可以通过把程序实体的标识符作为该命令的参数来达到查看其文档的目的。
插播: 所谓Go语言的程序实体,是指变量、常量、函数、结构体以及接口。而程序实体的标识符即是代表它们的名称。标识符又分非限定标识符和限定标识符。其中,限定标识符一般用于表示某个代码包中的程序实体或者某个结构体类型中的方法或字段。例如,标准库代码包io
中的名为EOF
的变量用限定标识符表示即io.EOF
。又例如,如果我有一个sync.WaitGroup
类型的变量wg
并且想调用它的Add
方法,那么可以这样写wg.Add()
。其中,wg.Add
就是一个限定标...
在《Go并发编程实战》的第二章中,我介绍了Go源码文件的分类。Go源码文件包括:命令源码文件、库源码文件和测试源码文件。其中,命令源码文件总应该属于main
代码包,且在其中有无参数声明、无结果声明的main函数。单个命令源码文件可以被单独编译,也可以被单独安装(可能需要设置环境变量GOBIN)。当然,命令源码文件也可以被单独运行。我们想要运行命令源码文件就需要使用命令go run
。
go run
命令可以编译并运行命令源码文件。由于它其中包含了编译动作,因此它也可以接受所有可用于go build
命令的标记。除了标记之外,go run
命令只接受Go源码文件作为参数,而不接受代码包。与go b...