Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 22 additions & 5 deletions 0.0.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,26 @@
## 0.0 标准命令详解
# 标准命令详解

为了让讲解更具关联性,也为了让读者能够更容易的理解这些命令和工具,本教程并不会按照这些命令的字典顺序讲解它们,而会按照我们在实际开发过程中通常的使用顺序以及它们的重要程度的顺序推进说明。 我们先从```go build```命令开始
Go语言的1.5版本在标准命令方面有了重大变更。这倒不是说它们的用法有多大的变化,而是说它们的底层支持已经大变样了。让我们先来对比一下`$GOROOT/pkg/tool/<平台相关目录>`中的内容。以下简称此目录为Go工具目录

**插播:**平台相关目录即以<GOOS>_<GOARCH>命名的目录,用于存放因特定平台的不同而不同的代码包归档文件或可执行文件。其中,<GOOS>代表特定平台的操作系统代号,而<GOARCH>则代表特定平台的计算架构代号。使用`go env`命令便可查看它们在你的计算机中的实际值。

1.4版本的Go工具目录的内容如下:

## links
* [目录](catalog.md)
* 下一节: [go build](0.1.md)
```bash
5a 5l 6g 8c addr2line dist objdump tour
5c 6a 6l 8g cgo fix pack vet
5g 6c 8a 8l cover nm pprof yacc
```

下面是Go 1.5版本的:

```bash
addr2line asm compile dist fix nm pack tour vet
api cgo cover doc link objdump pprof trace yacc
```

可以看到,1.5版本的目录内容精简了不少。这是因为Go 1.5的编译器、链接器都已经完全用Go语言重写了。而在这之前,它们都是用C语言写的,因此不得不为每类平台编写不同的程序并生成不同的文件。例如,8g、6g和5g分别是gc编译器在x86(32bit)、x86-64(64bit)和ARM计算架构的计算机上的实现程序。相比之下,用Go语言实现的好处就是,编译器和链接器都将是跨平台的了。简要来说,Go 1.5版本的目录中的文件compile即是统一后的编译器,而文件link则是统一后的链接器。

本教程并不会讲解Go语言的编译器、链接器以及其它工具是怎样被编写出来的,并只会关注于怎样用好包含它们在内的Go语言自带的命令和工具。

为了让讲解更具关联性,也为了让读者能够更容易的理解这些命令和工具,本教程并不会按照这些命令的字典顺序描述它们,而会按照我们在实际开发过程中通常的使用顺序以及它们的重要程度来逐一进行说明。现在,我们就先从`go build`命令开始。
376 changes: 180 additions & 196 deletions 0.1.md

Large diffs are not rendered by default.

9 changes: 1 addition & 8 deletions 0.10.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
### 0.10 go fix与go tool fix
# go fix与go tool fix


命令```go fix```会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。这里所说的版本即Go语言的版本。代码包的所有Go语言源码文件不包括其子代码包(如果有的话)中的文件。修正操作包括把对旧程序调用的代码更换为对新程序调用的代码、把旧的语法更换为新的语法,等等。
Expand Down Expand Up @@ -83,10 +83,3 @@ _表0-15 ```go tool fix```命令的标记说明_
}

上述示例的输出结果中有这样一行提示信息:“standard input: fixed netipv6zone”。其中,“standard input”表明源码是从标准输入而不是源码文件中获取的,而“fixed netipv6zone”则表示名为netipv6zone的修正操作发现输入的源码中有需要修正的地方,并且已经修正完毕。另外,我们还可以看到,输出结果中的代码已经经过了格式化。



## links
* [目录](catalog.md)
* 上一节: [go fmt与gofmt](0.9.md)
* 下一节: [go vet与go tool vet](0.11.md)
11 changes: 2 additions & 9 deletions 0.11.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
### 0.11 go vet与go tool vet
# go vet与go tool vet

命令```go vet```是一个用于检查Go语言源码中静态错误的简单工具。与大多数Go命令一样,```go vet```命令可以接受```-n```标记和```-x```标记。```-n```标记用于只打印流程中执行的命令而不真正执行它们。```-n```标记也用于打印流程中执行的命令,但不会取消这些命令的执行。示例如下:

Expand Down Expand Up @@ -1446,11 +1446,4 @@ _表0-19 格式化字符串中动词的格式要求_

如果标记``-asmdecl```有效(标记值不为```false```),那么命令程序会对汇编语言的源码文件进行检查。对汇编语言源码文件及相应编写规则的解读已经超出了本书的范围,所以我们并不在这里对此项检查进行描述。如果读者有兴趣的话,可以查看此项检查的程序的源码文件asmdecl.go。它在Go语言安装目录的子目录src/cmd/vet下。

至此,我们对```go vet```命令和```go tool vet```命令进行了全面详细的介绍。之所以花费如此大的篇幅来介绍这两个命令,不仅仅是为了介绍此命令的使用方法,更是因为此命令程序的检查工作涉及到了很多我们在编写Go语言代码时需要避免的“坑”。由此我们也可以知晓应该怎样正确的编写Go语言代码。同时,我们也应该在开发Go语言程序的过程中经常使用```go tool vet```命来检查代码。



## links
* [目录](catalog.md)
* 上一节: [go fix与go tool fix](0.10.md)
* 下一节: [go tool pprof](0.12.md)
至此,我们对```go vet```命令和```go tool vet```命令进行了全面详细的介绍。之所以花费如此大的篇幅来介绍这两个命令,不仅仅是为了介绍此命令的使用方法,更是因为此命令程序的检查工作涉及到了很多我们在编写Go语言代码时需要避免的“坑”。由此我们也可以知晓应该怎样正确的编写Go语言代码。同时,我们也应该在开发Go语言程序的过程中经常使用```go tool vet```命来检查代码。
11 changes: 2 additions & 9 deletions 0.12.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
### 0.12 go tool pprof
# go tool pprof

我们可以使用```go tool pprof```命令来交互式的访问概要文件的内容。命令将会分析指定的概要文件,并会根据我们的要求为我们提供高可读性的输出信息。

Expand Down Expand Up @@ -789,11 +789,4 @@ _图0-4 使用kcachegrind工具查看概要数据_

在本小节中,我们只使用```go tool pprof```命令对CPU概要文件进行了查看和分析。读者可以试着对内存概要文件和程序阻塞概要文件进行分析。

相对于普通的编程方式来讲,并发编程都是复杂的。所以,我们就更需要像pprof这样的工具为我们保驾护航。大家可以将本小节当作一篇该工具的文档,并在需要时随时查看。



## links
* [目录](catalog.md)
* 上一节: [go vet与go tool vet](0.11.md)
* 下一节: [go tool cgo](0.13.md)
相对于普通的编程方式来讲,并发编程都是复杂的。所以,我们就更需要像pprof这样的工具为我们保驾护航。大家可以将本小节当作一篇该工具的文档,并在需要时随时查看。
11 changes: 2 additions & 9 deletions 0.13.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
### 0.13 go tool cgo
# go tool cgo


cgo也是一个Go语言自带的特殊工具。一般情况下,我们使用命令```go tool cgo```来运行它。这个工具可以使我们创建能够调用C语言代码的Go语言源码文件。这使得我们可以使用Go语言代码去封装一些C语言的代码库,并提供给Go语言代码或项目使用。
Expand Down Expand Up @@ -555,11 +555,4 @@ Go语言可以使它的函数被C语言代码所用。这是通过使用一个
CFunction1() is called.
GoFunction1() is called.

在上例中,我们首先删除了代码包```basic/cgo/lib```目录下的子目录_obj,以此来保证原始的测试环境。然后,我们直接运行了命令源码文件cgo_demo.go。在这个源码文件中,包含了对代码包```basic/cgo/lib```中函数的调用语句,而在这些函数中又包含了对代码包C的引用。从输出信息我们可以看出,命令源码文件cgo_demo.go的运行成功的完成了。这也验证了标准go命令在这方面的功能。不过,有时候我们还是很有必要单独使用```go tool cgo```命令,比如对相关的Go语言代码和C语言代码的功能进行验证或者需要通过标记定制化运行cgo工具的时候。另外,如果我们通过标准go命令构建或者安装直接或间接导入了代码C的命令源码文件,那么在生成的可执行文件中就会包含动态导入数据和动态链接器信息。我们可以使用```go tool cgo```命令查看可执行文件中的这些信息。



## links
* [目录](catalog.md)
* 上一节: [go tool pprof](0.12.md)
* 下一节: [go env](0.14.md)
在上例中,我们首先删除了代码包```basic/cgo/lib```目录下的子目录_obj,以此来保证原始的测试环境。然后,我们直接运行了命令源码文件cgo_demo.go。在这个源码文件中,包含了对代码包```basic/cgo/lib```中函数的调用语句,而在这些函数中又包含了对代码包C的引用。从输出信息我们可以看出,命令源码文件cgo_demo.go的运行成功的完成了。这也验证了标准go命令在这方面的功能。不过,有时候我们还是很有必要单独使用```go tool cgo```命令,比如对相关的Go语言代码和C语言代码的功能进行验证或者需要通过标记定制化运行cgo工具的时候。另外,如果我们通过标准go命令构建或者安装直接或间接导入了代码C的命令源码文件,那么在生成的可执行文件中就会包含动态导入数据和动态链接器信息。我们可以使用```go tool cgo```命令查看可执行文件中的这些信息。
8 changes: 1 addition & 7 deletions 0.14.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
### 0.14 go env
# go env

命令```go env```用于打印Go语言的环境信息。其中的一些信息我们在之前已经多次提及,但是却没有进行详细的说明。在本小节,我们会对这些信息进行深入介绍。我们先来看一看```go env```命令情况下都会打印出哪些Go语言通用环境信息。

Expand Down Expand Up @@ -211,9 +211,3 @@ GOTOOLDIR的值指明了Go工具目录的绝对路径。根据GOROOT、GOHOSTOS
上例的```go env```命令的输出信息中,每一行对一个环境信息的值,且其顺序与我们输入的环境信息名称的顺序一致。比如,386为环境信息GOARCH,而8则是环境信息GOCHAR的值。

```go env```命令能够让我们对当前的Go语言环境进行简要的了解。通过它,我们也可以对当前安装的Go语言的环境设置进行简单的检查。



## links
* [目录](catalog.md)
* 上一节: [go tool cgo](0.13.md)
Loading