Skip to content

Latest commit

 

History

History
100 lines (53 loc) · 3.25 KB

ch10.md

File metadata and controls

100 lines (53 loc) · 3.25 KB

第十章 包和工具

10.1 引言

  • Go 语言编译快是因为:

    • 所有的导入都必须在每一个源文件的开头显式列出,编译器在确定依赖性的时候不需要读取和处理整个文件。

    • 包的依赖性形成有向无环图,没有环,包可以独立甚至并行编译。

    • Go 包编译输出的目标文件不仅记录她自己的导出信息,还记录它所依赖包的导出信息。

10.2 导入路径

  • 导入路径是包的唯一字符串标识,用在 import 声明中

  • 除了标准库中的包,其他包的导入路径应该以互联网域名作为路径开始

10.3 包的声明

  • 每个 go 源文件开头都要进行包声明,作为该包被其他包引入时的默认标识符。通常包名是导入路径的最后一段。

  • 最后一段的例外:

    • 不管包的导入路径是什么,如果包定义一个可执行Go程序,那包名总是 main

    • 如果目录中有以 _test.go 结尾的文件名,这样的目录有两个包,一个普通包,一个测试包。

    • 有的管本管理工具会在导入路径追加版本号后缀: "gopkg.in/yaml.v2"。包名不含后缀,所以仍为 yaml

10.4 导入声明

  • 如果需要导入两个名字名字一样的包,需要重命名导入, 替代的名字仅影响当前文件:

    import (
        "crypto/rand"
        mrand "math/rand"
    )
  • 重命名导入也可用于简化冗长的包名,或者规避常见的局部变量冲突

10.5 空导入

  • 导入包时,如果只对包级别的变量执行初始化表达式并执行它的 init 函数时,使用空导入

  • 空导入通常用于注册被导入包内的函数或加载包中提供的驱动

10.6 包及其命名

  • 包名使用简短的名字,保持可读性和无歧义,使用复数形式避免预声明类型

  • 使用包名 + 成员名的组合描述成员作用

10.7 go 工具

  • 用 go help 查看内置文档的索引

10.7.1 工作空间的组织

  • GOPATH 环境变量指定工作空间的根。更新 GOPATH 变量来切换到不同的工作空间。

  • GOPATH 下有三个子目录:src 包含源文件,pkg 存储编译后的包,bin 包含可执行程序。

  • GOROOT 是 Go发行版的根目录,包含标准库的包。

  • go env 命令输出环境变量

10.7.2 包的下载

  • 用 go get 下载和编译包。加上 -u 升级包

  • 在项目中用 go mod 管理包

10.7.3 包的构建

  • go install 类似于 go build,但是会保存包的编译代码和命令在 pkg 和 bin 目录中。

  • 设置 GOOS 和 GOARCH 为不同平台和 CPU 架构编译命令。

10.7.4 包的文档化

  • Go 文档注释总是完整的语句。包声明的前面文档注释是整个包的文档注释,可以写在任何源文件中但一个包只能有一个。如果太长可以单独放到 doc.go 中。

  • 用 go doc 查询包,成员,方法的文档

  • 用 godoc -http :8000 加上 -analysis=type 和 -analysis=pointer 丰富展示的文档内容

10.7.5 内部包

  • 定义内部包使其可以被一小部分可信任的包访问

  • 在包的导入路径中加入"internal", 使其可以从以“internal”父目录为根的包导入

10.7.6 包的查询

  • go list 查询可用包的信息。见 go help list