.cxx文件_Go 学习笔记(2)—安装目录、工作区、源码文件和标准命令

9ba2c7d900ed079f11b5c0528ed98dc7.png

更多内容请关注WX 公众号 【程序员的自我进化】

1. GOROOT 安装目录说明

GOROOT 的值是 Go 安装目录。安装目录如下所示:

wohu@wohu:/usr/local/go$ lsapi      bin              CONTRIBUTORS  favicon.ico  LICENSE  PATENTS  README.md   src   VERSIONAUTHORS  CONTRIBUTING.md  doc           lib          misc     pkg      robots.txt  testwohu@wohu:/usr/local/go$

目录说明

1.api 用于存放依照 Go 版本顺序的 API 增量列表文件。这里所说的 API 包含公开的变量,常量,函数等

2.bin 用于存放主要的标准命令文件,包括 go,godoc 和gofmt doc 用于存放标准库的 HTML 格式的程序文档。我们可以通过 godoc 命令启动一个 Web 程序展现这些文档

3.lib 用于存放一些特殊的库文件

4.misc 用于存放一些辅助类的说明和工具

5.pkg 用于存放安装 Go 标准库的所有归档文件

6.src 用于存放 Go 本身,Go 标准工具以及标准库的所有源码文件

7.test 存放用来测试和验证Go本身的所有相关文件

  • pkg 目录:
wohu@wohu:/usr/local/go$ ls pkg/include  linux_amd64  linux_amd64_race  tool

你会发现其中有名称为 “linux_amd64” 的文件夹,我们称为平台相关目录。这类文件夹的名称由对应的操作系统和计算架构的名称组合而成。

通过 go install 命令,Go 程序(这里是标准库中的程序)会被编译成平台相关的归档文件存放到其中。另外,“pkg/tool/linux_amd64”文件夹存放了使用 Go 制作软件时用到的很多强大的命令和工具。

wohu@wohu:/usr/local/go$ ls pkg/linux_amd64archive    context.a  encoding    fmt.a   html.a    io     math.a  os        reflect.a  sort.a     syscall.a  unicodebufio.a    crypto     encoding.a  go      image     io.a   mime    os.a      regexp     strconv.a  testing    unicode.abytes.a    crypto.a   errors.a    hash    image.a   log    mime.a  path      regexp.a   strings.a  testing.acompress   database   expvar.a    hash.a  index     log.a  net     path.a    runtime    sync       textcontainer  debug      flag.a      html    internal  math   net.a   plugin.a  runtime.a  sync.a     time.awohu@wohu:/usr/local/go$

2. GOPATH 工作区间说明

GOPATH 为自己项目的工作区间, 在学习笔记(1)中我们已经进行了设置。通过 go env 可以看到 GO 的全部环境变量。

wohu@wohu:~/gocode$ go envGOARCH="amd64"GOBIN="/home/wohu/gocode/bin"GOCACHE="/home/wohu/.cache/go-build"GOEXE=""GOFLAGS=""GOHOSTARCH="amd64"GOHOSTOS="linux"GOOS="linux"GOPATH="/home/wohu/gocode"GOPROXY=""GORACE=""GOROOT="/usr/local/go"GOTMPDIR=""GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"GCCGO="gccgo"CC="gcc"CXX="g++"CGO_ENABLED="1"GOMOD=""CGO_CFLAGS="-g -O2"CGO_CPPFLAGS=""CGO_CXXFLAGS="-g -O2"CGO_FFLAGS="-g -O2"CGO_LDFLAGS="-g -O2"PKG_CONFIG="pkg-config"GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build076028171=/tmp/go-build -gno-record-gcc-switches"

GOPATH 是作为编译后二进制的存放目的地和 import 包时的搜索路径 (其实也是你的工作目录,可以在 src 下创建你自己的 Go 源文件, 然后开始工作),一般情况下,Go 源码文件必须放在工作区中。

GOPATH 之下主要包含三个目录: bin、pkg、src

wohu@wohu:~/gocode$ echo $GOPATH/home/wohu/gocodewohu@wohu:~/gocode$ lsbin  pkg  srcwohu@wohu:~/gocode$

我们需要将工作区的目录路径添加到环境变量 GOPATH 中。否则,即使处于同一工作区(事实上,未被加入 GOPATH 中的目录不用管成为工作区),代码之间也无法通过绝对代码包路径调用。

在实际开发环境中,工作区可以只有一个,也可以由多个,这些工作区的目录路径都需要添加到 GOPATH 中。与 GOROOT 一样,我们应确保 GOPATH 一直有效。

GOPATH="/home/wohu/gocode"

2.1 src 目录

  • src 目录:主要存放 Go 的源码文件

用于以代码包的形式组织并保存 Go 源码文件,这里的代码包与 src 下子目录一一对应。例如,若一个源码文件被声明属于代码包 log,那么它就应当保存在 “src/log” 目录中。当然,你也可以把 Go 源码文件直接放在 src 目录下,但这样的 Go 源码文件就只能被声明属于 main 代码包了

除非用于临时测试或演示,一般还是建议把 Go 源码文件存入特定的代码包中。

2.2 pkg 目录

  • pkg 目录:存放编译好的库文件, 主要是 *.a 文件

用于存放通过 go install 命令安装后的代码包的归档文件。前提是代码包中必需包含 Go 库源码文件。归档文件是指那些名称以 “.a” 结尾的文件。

该目录与 GOROOT 目录下的 pkg 目录功能类似。区别在于,工作区中的 pkg 目录专门用来存放用户代码的归档文件

编译和安装用户代码的过程一般会以代码包为单位进行。比如 log 包被编译安装后,将生成一个名为 log.a 的归档文件,并存放在当前工作区的 pkg 目录下的平台相关目录中。

2.3 bin 目录

  • bin 目录:主要存放可执行文件

与 pkg 目录类似,在通过 go install 命令完成安装后,保存由 Go 命令源码文件生成的可执行文件。在类 Unix 操作系统下,这个可执行文件一般来说名称与源码文件的主文件名相同。

而在 windows 操作系统下,这个可执行文件的名称则是源码文件主文件名加 “.exe” 后缀。

需要把 GOPATH 中的可执行目录 bin 也配置到环境变量中,否则自行下载的第三方 go 工具就无法使用了。

GOBIN="/home/wohu/gocode/bin"

注意:GOPATH 中不要包含 Go 语言的安装目录,以便将 Go 语言本身的工作区同用户工作区严格分开。通过 Go 工具中的代码获取命令 go get ,可以指定项目的代码下载到我们在 GOPATH 中设定的第一个工作区中,并在其中完成编译和安装。

三个目录下的文件如下所示:

wohu@wohu:~/gocode$ ls bin/dlv  gocode  godef  golint  go-outline  gopkgs  goplay  gorename  goreturns  go-symbols  guru  implwohu@wohu:~/gocode$ ls pkg/linux_amd64  modwohu@wohu:~/gocode$ ls src/github.com  golang.org  hello  hello.go

3. 源码文件

Go 源码文件有分 3 种,即命令源码文件,库源码文件和测试源码文件。

3.1 命令源码文件

声明为属于 main 代码包,并且包含无参数声明和结果声明的 main 函数的源码文件。这类源码是程序的入口,可以独立运行(使用 go run 命令),也可以被 go build 或 go install 命令转换为可执行文件。

同一个代码包中的所有源码文件,其所属代码包的名称必须一致。如果命令源码文件和库源码文件处于同一代码包中,该包就无法正确执行 go build 和 go install 命令。换句话说,这些源码文件也就无法被编译和安装。因此,命令源码文件通常会单独放在一个代码包中。一般情况下,一个程序模块或软件的启动入口只有一个。

同一个代码包中可以有多个命令源码文件,可通过 go run 命令分别运行它们。但通过 go build 和 go install 命令无法编译和安装该代码包。所以一般情况下,不建议把多个命令源码文件放在同一个代码包中。

当代码包中有且仅有一个命令源码文件时,在文件所在目录中执行 go build 命令,即可在该目录下生成一个与目录同名的可执行文件;若使用 go install 命令,则可在当前工作区的 bin 目录下生成相应的可执行文件。

3.2 库源码文件

存在于某个代码包中的普通源码文件。通常,库源码文件声明的包名会与它实际所属的代码包(目录)名一致,且库源码文件中不包含无参数声明和无结果声明的 main 函数。如在 basic/set 目录下执行 go install 命令,成功地安装了 basic/set 包,并生成一个名为 set.a 的归档文件。归档文件的存放目录由以下规则产生:

  • 安装库源码文件时所生成的归档文件会被存放到当前工作区的 pkg 目录中。
  • 根据被编译的目标计算机架构,归档文件会被放置在 pkg 目录下的平台相关目录中。如上的 set.a 在 64 位 window 系统上就是 pkg/windows_amd64 目录中。
  • 存放归档文件的目录的相对路径与被安装的代码包的上一级代码包的相对路径是一致的。

第一个相对路径就是相对于工作区的 pkg 目录下的平台相关目录而言的,而第二个相对路径是相对于工作区的 src 目录而言的。如果被安装的代码包没有上一级代码包(也就是说它的父目录就是工作的 src 目录),那么它的归档文件就会被直接存放到当前工作区的 pkg 目录的平台相关目录下。如 basic 包的归档文件 basic.a 总会被直接存放到 pkg/windows_amd64 目录下,而 basic/set 包的归档文件 set.a 则会被存放到 pkg/windows_amd64/basic 目录下。

3.3 测试源码文件

这是一种特殊的库文件,可以通过执行 go test 命令运行当前代码包下的所有测试源码文件。成为测试源码文件的充分条件有两个:

  • 文件名需要以 ”_test.go” 结尾
  • 文件中需要至少包含该一个名称为 Test 开头或 Benchmark 开头,拥有一个类型为 *testing.T 或 testing.B 的参数的函数。类型 testing.T 或 testing.B 是两个结构体类型。

当在某个代码包中执行 go test 命令,该代码包中的所有测试源码文件就会被找到并运行。

注意:存储 Go 代码的文本文件需要以 UTF-8 编码存储。如果源码文件中出现了非 UTF-8 编码的字符,则在运行、编译或安装时,Go 会抛出 “illegal UTF-8 sequence” 的错误。

代码示例 :

wohu@wohu:~/GoCode/src$ tree -L  3.├── download│   └── download_demo.go├── main.go└── upload    └── upload_demo.go

download_demo.go 代码内容:

package downloadimport "fmt"// Download_imge 方法名首字母大写,表示外部可以调用func Download_imge() {fmt.Println("This is download image demo")}

upload_demo.go 代码内容:

package uploadimport "fmt"// Upload_imge 方法名首字母大写,表示外部可以调用func Upload_imge() {fmt.Println("This is upload image demo")}

main.go 代码内容:

package mainimport ("download""upload")func main() {upload.Upload_imge()download.Download_imge()}

分别执行 go run , go build , go install 命令, 可以看到能有正常的输出、会生成二进制文件 main,并且在 bin 目录下有对应的二进制文件。

wohu@wohu:~/GoCode/src$ go run main.go This is upload image demoThis is download image demowohu@wohu:~/GoCode/src$ lsdownload    main.go    uploadwohu@wohu:~/GoCode/src$ go build main.go wohu@wohu:~/GoCode/src$ lsdownload   main  main.go   uploadwohu@wohu:~/GoCode/src$ ./main This is upload image demoThis is download image demowohu@wohu:~/GoCode/src$ go install main.go wohu@wohu:~/GoCode/src$ ls ../bin/ mainwohu@wohu:~/GoCode/src$ ls ../pkg/wohu@wohu:~/GoCode/src$ 

4. 标准命令简述

Go 本身包含来大量用于处理 Go 程序的命令和工具。

4.1 常用命令

  • build

用于编译指定的代码包或 Go 语言源码文件。命令源码文件会被编译成可执行文件,并存放到命令执行的目录或指定目录下。而库源码文件被编译后,则不会在非临时目录中留下任何文件。

  • clean

用于清除因执行其他 go 命令而遗留下来的临时目录和文件。

  • doc

用于显示打印 Go 语言代码包以及程序实体的文档。

  • env

用于打印 Go 语言相关的环境信息。

  • fix

用于修正指定代码的源码文件中包含的过时语法和代码调用。这使得我们在升级 Go 语言版本时,可以非常方便地同步升级程序。

  • fmt

用于格式化指定代码包中的 Go 源码文件。实际上,它是通过执行 gofmt 命令来实现功能的。

  • generate

用于识别指定代码中资源文件中的 “go:generate” 注释,并执行其携带的任意命令。该命令独立于 Go 语言标准的编译和安装体系。如果你有需要解析的 “go:generate” 注释,就单独运行它。这个命令非常有用,我常用它自动生成或改动 Go 源码文件。

  • get

用于下载,编译并安装指定改动代码包及其依赖包。从我们自己的代码中转站或第三方代码库上自动拉取代码,就全靠它了。

  • install

用于编译并安装指定的代码包及其依赖包。安装命令源码文件后,代码包所在的工作区目录的 bin 子目录,或者当前环境变量 GOBIN 指向的目录中会生成相应的可执行文件。安装源码文件后,会在代码包所在的工作目录的 pkg 子目录中生成相应的归档文件。

  • list

用于显示指定代码包的信息,它可谓是代码包分析的一大便利工具。利用 Go 语言标准代码库代码包 “text/template” 中规定的模版语法,你可以非常灵活的控制输出信息。

  • run

用于编译并运行指定的代码源码文件。当你想不生成可执行文件而直接运行命令源码文件时,就需要用到它。

  • test

用于测试指定的代码包,前提是该代码包目录中必须存在测试源代码文件。

  • tool

用于运行 Go 语言的特殊工具。

  • vet

如果开发人员已经写了一些代码,vet 命令会帮开发人员检测代码的常见错误。让我们看看 vet 捕获哪些类型的错误。

  • Printf类函数调用时,类型匹配错误的参数。
  • 定义常用的方法时,方法签名的错误。
  • 错误的结构标签。
  • 没有指定字段名的结构字面量。

用于检查指定代码包中的 Go 语言代码,并报告发现可疑代码问题。该命令提供了除编译之外的又一个程序检查方法,可用于找到程序中的潜在错误。

go vet main.go
  • version

用于显示当前安装的 Go 语言的版本信息以及计算环境。

4.2 附加参数

执行上述命令时,可以通过附加一些额外的标记来定制命令的执行过程。下面是一个比较通用的标记。

  • -n

使命令仅打印其执行过程中用到的所有命令,而不真正执行它们。如果只想查看或验证命令的执行过程,而不想改变任何东西,使用它正合适。

  • -race

用于检测并报告指定 Go 语言程序中存在的数据竞争问题。当用 Go 语言编写并发程序时,这是很重要的检测手段之一。

  • -v

用于打印命令执行过程中涉及的代码包。这一定包括我们指定的目标代码包,并且有时还会包括该代码包直接或间接依赖的那些代码包。这会让你知道哪些代码包被命令处理过了。

  • -work

用于打印命令执行时生成和使用的临时工作目录的名字,且命令执行完成后不删除它。这个目录下的文件可能会对你有用,也可以从侧面了解命令的执行过程。如果不添加此标记,那么临时工作目录会在命令执行完毕前删除。

  • -x:

使命令打印其执行过程中用到的所有命令,同时执行它们。

我们可以把这些标记看作命令的特殊参数,他们都可以添加到命令名称和命令的真正参数中间。用于编译, 安装,运行和测试 Go 语言代码包或源码文件的命令都支持它们。上面提到了 tool 这个子命令,它用来运行一些特殊的 Go 语言工具。直接执行 go tool 命令,可以看到这些特殊工具。它们有的是其他 Go 标准命令的底层支持,有的规则是可以独当一面的利器。其中有两个工具值得特别介绍一下。

  • pprof

用于以交互的方式访问一些性能概要文件。命令将会分析给定的概要文件,并根据要求提供高可读性的输出信息。这个工具可以分析的概要文件包括 CPU 概要文件,内存概要文件和程序阻塞概要文件。这些包含 Go 程序运行信息的概要文件,可以通过标准库代码 runtime 和runtime/pprof 中的程序来生成。

  • trace

用于读取 Go 程序踪迹文件,并以图形化的方式展现出来。它能够让我们深入了解 Go 程序在运行过程中的内部情况。比如,当前进程中堆的大小及使用情况。又比如,程序中的多个 goruntime 是怎样调度的,以及它们在某个时刻被调度的原因。Go 程序踪迹文件可以通过标准代码包 “runtime/trace” 和 “net/http/pprof” 中的程序来生成。

上述的两个特殊的工具对 Go 程序调优非常有用。如果想探究程序运行的过程,或者想让程序跑的更快,更稳定,那么这两个工具是必知必会的。另外,这两个工具都受到 go test 命令的直接支持。因此你可以很方便地把它们融入到程序测试当中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值