GOROOTGoGOGOPATHGo Modulego getGOBINGogo installGo

1. GOROOT 安装目录说明

GOROOTGo
wohu@wohu:/usr/local/go$ ls
api      bin              CONTRIBUTORS  favicon.ico  LICENSE  PATENTS  README.md   src   VERSION
AUTHORS  CONTRIBUTING.md  doc           lib          misc     pkg      robots.txt  test
wohu@wohu:/usr/local/go$
目录说明
api用于存放依照 Go 版本顺序的 API 增量列表文件。这里所说的 API 包含公开的变量,常量,函数等
bin用于存放主要的标准命令文件,包括 go,godoc 和gofmt
doc用于存放标准库的 HTML 格式的程序文档。我们可以通过 godoc 命令启动一个 Web 程序展现这些文档
lib用于存放一些特殊的库文件
misc用于存放一些辅助类的说明和工具
pkg用于存放安装 Go 标准库的所有归档文件
src用于存放 Go 本身,Go 标准工具以及标准库的所有源码文件
test存放用来测试和验证Go本身的所有相关文件
  • pkg 目录:
wohu@wohu:/usr/local/go$ ls pkg/
include  linux_amd64  linux_amd64_race  tool
linux_amd64
go installGopkg/tool/linux_amd64Go
wohu@wohu:/usr/local/go$ ls pkg/linux_amd64
archive    context.a  encoding    fmt.a   html.a    io     math.a  os        reflect.a  sort.a     syscall.a  unicode
bufio.a    crypto     encoding.a  go      image     io.a   mime    os.a      regexp     strconv.a  testing    unicode.a
bytes.a    crypto.a   errors.a    hash    image.a   log    mime.a  path      regexp.a   strings.a  testing.a
compress   database   expvar.a    hash.a  index     log.a  net     path.a    runtime    sync       text
container  debug      flag.a      html    internal  math   net.a   plugin.a  runtime.a  sync.a     time.a
wohu@wohu:/usr/local/go$

2. GOPATH 工作区间说明

GOPATHgo envGo
wohu@wohu:~/gocode$ go env
GOARCH="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"
GOPATHimportsrcGoGo
GOPATHbin、pkgsrc
wohu@wohu:~/gocode$ echo $GOPATH
/home/wohu/gocode
wohu@wohu:~/gocode$ ls
bin  pkg  src
wohu@wohu:~/gocode$
GOPATH 中GOPATH
GOPATHGOROOTGOPATH
GOPATH="/home/wohu/gocode"
GoGOPATHGOPATHGo
/home/davy/projectAGOPATH/home/davy/projectBGOPATHGOPATH/home/davy/projectA
GoGOPATHGOPATH
GOPATHGOPATHGoGo
Go.a
.aarchiveC
GoGOROOTGOPATH
wohu@ubuntu-dev:~/project/go/src/github.com$ go install github.com/ramya-rao-a/go-outline
can't load package: package github.com/ramya-rao-a/go-outline: cannot find package "github.com/ramya-rao-a/go-outline" in any of:/usr/local/go/src/github.com/ramya-rao-a/go-outline (from $GOROOT)/home/wohu/project/go/src/github.com/ramya-rao-a/go-outline (from $GOPATH)
GoGOPATH

2.1 src 目录

srcGo
GosrcGosrcGomain
Go

2.2 pkg 目录

pkg.a
go installGo.a
GOROOTpkg
pkg
.aGoGo

2.3 bin 目录

bin
go installGo

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

GOPATHbin
GOBIN="/home/wohu/gocode/bin"
GOPATHGoGoGogo getGOPATH

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

wohu@wohu:~/gocode$ ls bin/
dlv  gocode  godef  golint  go-outline  gopkgs  goplay  gorename  goreturns  go-symbols  guru  impl
wohu@wohu:~/gocode$ ls pkg/
linux_amd64  mod
wohu@wohu:~/gocode$ ls src/
github.com  golang.org  hello  hello.go
  1. Go 语言源码的组织方式
.go
GoGOPATHsrcGoGOPATHsrc
  1. 了解源码安装后的结果
src.apkgbin
  1. 理解构建和安装 Go 程序的过程
go buildgo install

如果构建的是库源码文件,那么操作后产生的结果文件只会存在于临时目录中。这里的构建的主要意义在于检查和验证。

如果构建的是命令源码文件,那么操作的结果文件会被搬运到源码文件所在的目录中。

安装操作会先执行构建,然后还会进行链接操作,并且把结果文件搬运到指定目录。进一步说,

pkgbinGOBIN

3. 源码文件

Go

构建 = 编译 + 链接

gopkgpkggopkggo
Go

3.1 命令源码文件

mainmaingo rungo buildgo install
go buildgo install
go rungo buildgo install
go buildgo install
GomainmainGogo rungo build

3.2 库源码文件

**main**
go install
  • 安装库源码文件时所生成的归档文件会被存放到当前工作区的 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 rungo buildgo install
wohu@wohu:~/GoCode/src$ go run main.go 
This is upload image demo
This is download image demo
wohu@wohu:~/GoCode/src$ ls
download    main.go    upload
wohu@wohu:~/GoCode/src$ go build main.go 
wohu@wohu:~/GoCode/src$ ls
download   main  main.go   upload
wohu@wohu:~/GoCode/src$ ./main 
This is upload image demo
This is download image demo
wohu@wohu:~/GoCode/src$ go install main.go 
wohu@wohu:~/GoCode/src$ ls ../bin/main
wohu@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
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
  • pprof

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

  • trace

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

go test