diff --git a/0.0.md b/0.0.md index f56a126..18fc7a1 100644 --- a/0.0.md +++ b/0.0.md @@ -1,9 +1,3 @@ -## 0.0 标准命令详解 +# 标准命令详解 为了让讲解更具关联性,也为了让读者能够更容易的理解这些命令和工具,本教程并不会按照这些命令的字典顺序讲解它们,而会按照我们在实际开发过程中通常的使用顺序以及它们的重要程度的顺序推进说明。 我们先从```go build```命令开始。 - - - -## links - * [目录](catalog.md) - * 下一节: [go build](0.1.md) \ No newline at end of file diff --git a/0.1.md b/0.1.md index a6c92c7..e194a7a 100644 --- a/0.1.md +++ b/0.1.md @@ -1,4 +1,4 @@ -### 0.1 go build +# go build @@ -223,10 +223,3 @@ gc是Go语言的官方编译器。8g、6g和5g分别是gc编译器在x86(32bit 8l、6l和5l分别是在x86(32bit)计算架构、x86-64(64bit)计算架构和ARM计算架构的计算机上的链接器。 顺便提一下,Go语言的专用环境变量GOARCH对应于x86(32bit)计算架构、x86-64(64bit)计算架构和ARM计算架构的值分别为386、amd64和arm。 - - - -## links - * [目录](catalog.md) - * 上一节: [标准命令详解](0.0.md) - * 下一节: [go install](0.2.md) diff --git a/0.10.md b/0.10.md index cc06f8c..5d6c56f 100644 --- a/0.10.md +++ b/0.10.md @@ -1,4 +1,4 @@ -### 0.10 go fix与go tool fix +# go fix与go tool fix 命令```go fix```会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。这里所说的版本即Go语言的版本。代码包的所有Go语言源码文件不包括其子代码包(如果有的话)中的文件。修正操作包括把对旧程序调用的代码更换为对新程序调用的代码、把旧的语法更换为新的语法,等等。 @@ -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) diff --git a/0.11.md b/0.11.md index b83f177..1706101 100644 --- a/0.11.md +++ b/0.11.md @@ -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```标记也用于打印流程中执行的命令,但不会取消这些命令的执行。示例如下: @@ -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) \ No newline at end of file +至此,我们对```go vet```命令和```go tool vet```命令进行了全面详细的介绍。之所以花费如此大的篇幅来介绍这两个命令,不仅仅是为了介绍此命令的使用方法,更是因为此命令程序的检查工作涉及到了很多我们在编写Go语言代码时需要避免的“坑”。由此我们也可以知晓应该怎样正确的编写Go语言代码。同时,我们也应该在开发Go语言程序的过程中经常使用```go tool vet```命来检查代码。 \ No newline at end of file diff --git a/0.12.md b/0.12.md index 03a78c6..c59e390 100644 --- a/0.12.md +++ b/0.12.md @@ -1,4 +1,4 @@ -### 0.12 go tool pprof +# go tool pprof 我们可以使用```go tool pprof```命令来交互式的访问概要文件的内容。命令将会分析指定的概要文件,并会根据我们的要求为我们提供高可读性的输出信息。 @@ -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) \ No newline at end of file +相对于普通的编程方式来讲,并发编程都是复杂的。所以,我们就更需要像pprof这样的工具为我们保驾护航。大家可以将本小节当作一篇该工具的文档,并在需要时随时查看。 \ No newline at end of file diff --git a/0.13.md b/0.13.md index 8a5417c..6024bba 100644 --- a/0.13.md +++ b/0.13.md @@ -1,4 +1,4 @@ -### 0.13 go tool cgo +# go tool cgo cgo也是一个Go语言自带的特殊工具。一般情况下,我们使用命令```go tool cgo```来运行它。这个工具可以使我们创建能够调用C语言代码的Go语言源码文件。这使得我们可以使用Go语言代码去封装一些C语言的代码库,并提供给Go语言代码或项目使用。 @@ -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) \ No newline at end of file +在上例中,我们首先删除了代码包```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```命令查看可执行文件中的这些信息。 \ No newline at end of file diff --git a/0.14.md b/0.14.md index a222c22..a4b836d 100644 --- a/0.14.md +++ b/0.14.md @@ -1,4 +1,4 @@ -### 0.14 go env +# go env 命令```go env```用于打印Go语言的环境信息。其中的一些信息我们在之前已经多次提及,但是却没有进行详细的说明。在本小节,我们会对这些信息进行深入介绍。我们先来看一看```go env```命令情况下都会打印出哪些Go语言通用环境信息。 @@ -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) \ No newline at end of file diff --git a/0.2.md b/0.2.md index f6866e1..9388338 100644 --- a/0.2.md +++ b/0.2.md @@ -1,4 +1,4 @@ -### 0.2 go install +# go install 命令```go install```用于编译并安装指定的代码包及它们的依赖包。当指定的代码包的依赖包还没有被编译和安装时,该命令会先去处理依赖包。与```go build```命令一样,传给```go install```命令的代码包参数,应该以导入路径的形式提供。并且,```go build```命令的绝大多数标记也都可以用于```go install```命令。实际上,```go install```命令只比```go build```命令多做了一件事,即:安装编译后的结果文件到指定目录。 @@ -157,11 +157,4 @@ 而且,在我们为环境变量GOBIN设置了正确的值之后,这个错误提示信息仍然会出现。这是因为,只有在安装命令源码文件的时候,命令程序才会将环境变量GOBIN的值作为结果文件的存放目录。而在安装库源码文件时,在命令程序内部的代表结果文件存放目录路径的变量不会被赋值。最后,命令程序会发现它依然是个无效的空值。所以,命令程序会同样返回一个关于“无安装位置”的错误。这就引出一个结论,我们只能使用安装代码包的方式来安装库源码文件,而不能在```go install```命令罗列并安装它们。另外,```go install```命令目前无法接受标记```-o```以自定义结果文件的存放位置。这也从侧面说明了```go install```命令当前还不支持针对库源码文件的安装操作。 -单从上述问题来讲,Go工具在执行错误识别及其提示信息的细分方面还没有做到最好。 - - - -## links - * [目录](catalog.md) - * 上一节: [go build](0.1.md) - * 下一节: [go get](0.3.md) +单从上述问题来讲,Go工具在执行错误识别及其提示信息的细分方面还没有做到最好。 \ No newline at end of file diff --git a/0.3.md b/0.3.md index 6359bb7..cce907e 100644 --- a/0.3.md +++ b/0.3.md @@ -1,9 +1,8 @@ -### 0.3 go get - +# go get hc@ubt:~$ go get github.com/hyper-carrot/go_lib - + 命令```go get```可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。在上面这个示例中,我们从著名的代码托管站点Github上下载了一个项目(或称代码包),并安装到了环境变量GOPATH中包含的第一个工作区中。在本机中,这个代码包的导入路径就是github.com/hyper-carrot/go_lib。 @@ -308,11 +307,4 @@ _表0-4 ```go get```命令的特有标记说明_ 将这两个示例进行对比,我们会很容易发现它们之间的区别。第二个示例的命令执行过程中使用```git show-ref```查看所有分支和标签,当发现有匹配的信息又通过```git show-ref tags/go1 origin/go1```命令进行精确查找,在确认无误后将本地代码包的版本切换到标签“go1”之上。 -命令```go get```的这一功能是非常有用的。我们的代码在直接或间接依赖某些同时针对多个Go语言版本开发的代码包时,可以自动的检出其正确的版本。也可以说,```go get```命令内置了一定的代码包多版本依赖管理的功能。 - - - -## links - * [目录](catalog.md) - * 上一节: [go install](0.2.md) - * 下一节: [go clean](0.4.md) +命令```go get```的这一功能是非常有用的。我们的代码在直接或间接依赖某些同时针对多个Go语言版本开发的代码包时,可以自动的检出其正确的版本。也可以说,```go get```命令内置了一定的代码包多版本依赖管理的功能。 \ No newline at end of file diff --git a/0.4.md b/0.4.md index bd2b19d..1960729 100644 --- a/0.4.md +++ b/0.4.md @@ -1,4 +1,4 @@ -### 0.4 go clean +# go clean 执行```go clean```命令会删除掉执行其它命令时产生的一些文件和目录,包括: @@ -26,12 +26,4 @@ rm -f logging logging.exe logging.test logging.test.exe rm -f /home/hc/golang/goc2p/pkg/linux_386/logging.a -如果再加上标记```-r```又会打印出哪些命令呢?请读者自己试一试吧。 - - - -## links - * [目录](catalog.md) - * 上一节: [go get](0.3.md) - * 下一节: [godoc](0.5.md) - \ No newline at end of file +如果再加上标记```-r```又会打印出哪些命令呢?请读者自己试一试吧。 \ No newline at end of file diff --git a/0.5.md b/0.5.md index 0678b1f..bedc17b 100644 --- a/0.5.md +++ b/0.5.md @@ -1,4 +1,4 @@ -### 0.5 godoc +# godoc 命令```godoc```是一个很强大的工具,用于展示指定代码包的文档。我们可以通过运行```go get code.google.com/p/go.tools/cmd/godoc```安装它。 @@ -79,10 +79,3 @@ _图0-2 goc2p项目中的pkgtool包的Go文档页面_ 命令```godoc```还有很多可用的标记,但在通常情况下并不常用。读者如果有兴趣,可以在命令行环境下执行```godoc```进行查看。 至于怎样才能写出优秀的代码包文档,我在《Go并发编程实战》的5.2节中做了详细说明。 - - - -## links - * [目录](catalog.md) - * 上一节: [go clean](0.4.md) - * 下一节: [go run](0.6.md) diff --git a/0.6.md b/0.6.md index a42f714..7035f72 100644 --- a/0.6.md +++ b/0.6.md @@ -1,4 +1,4 @@ -### 0.6 go run +# go run @@ -88,10 +88,3 @@ 可见,```go run```命令会把追加到命令源码文件后面的参数原封不动的传给对应的可执行文件。 这就是一个命令源码文件从编译到运行的全过程。请记住,```go run```命令包含了两个动作:编译命令源码文件和运行对应的可执行文件。 - - - -## links - * [目录](catalog.md) - * 上一节: [godoc](0.5.md) - * 下一节: [go test](0.7.md) diff --git a/0.7.md b/0.7.md index ea13998..e29cbe0 100644 --- a/0.7.md +++ b/0.7.md @@ -1,4 +1,4 @@ -### 0.7 go test +# go test @@ -81,11 +81,4 @@ 上述这两个标记可以搭配使用。搭配使用的目的就是让```go test```命令既安装依赖包又编译测试代码,但不运行测试。也就是说,让命令程序跑一遍运行测试之前的所有流程。这可以测试一下测试过程。需要注意的是,在加入```-c```标记后,命令程序在编译测试代码并生成用于运行测试的一系列文件之后会把临时工作目录及其下的所有内容一并删除。如果想在命令执行结束后再去查看这些内容的话,我们还需要加入```-work```标记。 -除此之外,```go test```命令还有很多功效各异的标记。但是由于这些标记的复杂性,我们需要结合测试源码文件进行详细的讲解。所以我们把这些内容放在了本章的第二节中。 - - - -## links - * [目录](catalog.md) - * 上一节: [go run](0.6.md) - * 下一节: [go list](0.8.md) \ No newline at end of file +除此之外,```go test```命令还有很多功效各异的标记。但是由于这些标记的复杂性,我们需要结合测试源码文件进行详细的讲解。所以我们把这些内容放在了本章的第二节中。 \ No newline at end of file diff --git a/0.8.md b/0.8.md index 531dd81..b9e8e3e 100644 --- a/0.8.md +++ b/0.8.md @@ -1,4 +1,4 @@ -### 0.8 go list +# go list ```go list```命令的作用是列出指定的代码包的信息。与其他命令相同,我们需要以代码包导入路径的方式给定代码包。被给定的代码包可以有多个。这些代码包对应的目录中必须直接保存有Go语言源码文件,其子目录中的文件不算在内。否则,代码包将被看做是不完整的。现在我们来试用一下: @@ -561,11 +561,4 @@ 另外,```-tags```标记也可以被```go list```接受。它与我们在讲```go build```命令时提到的```-tags```标记是一致的。读者可以查看代码包```go/build``的文档以了解细节。 -```go list```命令很有用。它可以为我们提供指定代码包的更深层次的信息。这些信息往往是我们无法从源码文件中直观看到的。 - - - -## links - * [目录](catalog.md) - * 上一节: [go test](0.7.md) - * 下一节: [go fmt与gofmt](0.9.md) \ No newline at end of file +```go list```命令很有用。它可以为我们提供指定代码包的更深层次的信息。这些信息往往是我们无法从源码文件中直观看到的。 \ No newline at end of file diff --git a/README.md b/README.md index 3c57a0b..c934a42 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,25 @@ -go_command_tutorial -=================== +# GO 命令教程 -Golang command tutorial in Chinese. +## 作者介绍 -Based on Go 1.3.x +**郝林**,10年软件开发从业经验。搞过银行、电信软件和互联网社交等产品。对Go语言和Docker都情有独钟。现在正在从事互联网软件基础组件的构建以及Go语言技术推广和社区运营等工作。他也是图灵原创技术图书《Go并发编程实战》和在线免费教程《Go语言第一课》的作者。 -本教程的由来 -=================== +## 本教程的由来 这份Go命令教程原先是我著的图书《Go并发编程实战》(此书会由人民邮电出版社的图灵公司在2014年11月份出版)中的一部分。这部分内容与并发编程的关系不大,故被砍掉。但是它是有价值的,也算是我对Go语言官方提供的标准命令的一个学习笔记。所以,我觉得应该把它做成免费资源分享给大家。经出版社的认可,我将这份教程放在这里供广大Go语言爱好者阅读。 -相关源码 -=================== +## 相关源码 本教程中会提及一个名为```goc2p```的项目。该项目实际上是《Go并发编程实战》随书附带的示例项目。这本书中讲到的所有源码都在```goc2p```项目中。我最迟会在《Go并发编程实战》出版之时将[```goc2p```](https://github.com/hyper-carrot/goc2p)项目放出。 - -关于协议 -=================== +## 关于协议 我希望这个项目中的内容永远是免费的。也就是说,任何组织和个人不应该出于商业目的而摘取其中的内容。更详细的条款请阅读本项目中的[LICENSE](LICENSE)文件。 +## 版本信息 +书中演示代码基于以下版本: -开始阅读 -=================== - -请点击[目录](catalog.md)并开始阅读。如发现纰漏欢迎提issue,欢迎Pull Request。 +|系统|版本信息 +|---------|------ +|Go|1.3.x \ No newline at end of file diff --git a/SUMMARY.md b/SUMMARY.md index 4cdf562..ef8e885 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,17 +1,14 @@ -# Summary - -* [标准命令详解](0.0.md) - * [go build](0.1.md) - * [go install](0.2.md) - * [go get](0.3.md) - * [go clean](0.4.md) - * [godoc](0.5.md) - * [go run](0.6.md) - * [go test](0.7.md) - * [go list](0.8.md) - * [go fmt与go tool fix](0.10.md) - * [go vet与go tool vet](0.11.md) - * [go tool pprof](0.12.md) - * [go tool cgo](0.13.md) - * [go env](0.14.md) - +- [标准命令详解](0.0.md) + - [go build](0.1.md) + - [go install](0.2.md) + - [go get](0.3.md) + - [go clean](0.4.md) + - [godoc](0.5.md) + - [go run](0.6.md) + - [go test](0.7.md) + - [go list](0.8.md) + - [go fmt与go tool fix](0.10.md) + - [go vet与go tool vet](0.11.md) + - [go tool pprof](0.12.md) + - [go tool cgo](0.13.md) + - [go env](0.14.md) \ No newline at end of file diff --git a/config.json b/config.json index 770b6bd..e8acfb2 100644 --- a/config.json +++ b/config.json @@ -1,9 +1,4 @@ { - "name": "Go命令教程", - "introduction": "带你玩儿转Go语言的命令和工具。", - "title": "go command tutorial", - "keywords": "golang", - "path": { - "toc": "catalog.md" - } -} + "name": "GO 命令教程", + "introduction":"这份Go命令教程原先是我著的图书《Go并发编程实战》中的一部分。这部分内容与并发编程的关系不大,故被砍掉。但是它是有价值的,也算是我对Go语言官方提供的标准命令的一个学习笔记。所以,我觉得应该把它做成免费资源分享给大家。" +} \ No newline at end of file diff --git a/cover/background.jpg b/cover/background.jpg new file mode 100755 index 0000000..7726503 Binary files /dev/null and b/cover/background.jpg differ diff --git a/cover/logo.png b/cover/logo.png new file mode 100644 index 0000000..8675af7 Binary files /dev/null and b/cover/logo.png differ