7 包

  • fmt、os等这样有常用功能的内置包在Go中有一百多,
    • 称标准包(标准库),大部分都内置到Go本身
  • 完整列表可在Go Walker中查看
  • 或用go list std查看标准包列表

  • 本章
  • 包结构认识
  • 包的使用基础
  • 常用标准包详解
  • 使用自定义包

7.1包的基础

  • 不同模块(包)之间为实现某一类似功能会用相同的名字去命名一个函数,如果一个软件开发中要同时用两个模块(包),就会在调用函数时产生岐义
  • Go引入了命名空间,让每个包都定义一个命名空间,用于内部标识符的访问
  • 每个命名空间关联一个特定的包,使得在调用类型、函数时有了独一无二的简短明了的名字,避免产生命名冲突

  • Go的包可通过控制包内名的可见性来实现包的封装,
  • 限制包成员的可见性、隐藏具体的实现过程
  • 开发人调用时不必关心实现过程,直接用包的API,
  • 也允许包的维护者在不影响包的用户使用的前提下调整包的内部实现。
  • 通过限定包内函数与变量的可见性来约束用户操作,只允许用户通过特定的函数来访问和控制包内部的变量,这样不仅可以提高安全性(变量一致)还可以保持并发操作时的互斥约束。

  • 改动一个源文件,就必须重新编译该源文件,及它对应的包和所有依赖该包的其他包
  • 即使从头构建,编译速度也快于绝大部分编译语言
  • 得益于包设计三特性
  • (1)显式声明:导入的包必须在每个文件的开头显式声明
    • 编译器没必要读取和分析整个源文件来判断包的依赖关系
  • (2)无环依赖:禁止包的环状依赖,包的依赖关系形成一个有向无环,每个包可被独立编译,且很可能被并发编译
  • (3)无须遍历:编译后包的目标文件不仅记录包本身的导出信息,
    • 还记录包的依赖关系
    • 编译一个包的时候,编译器只需读取每个直接导入包的目标文件,
    • 不需要遍历所有依赖的文件,毕竟很多都是重复的间接依赖

7.1.1包的结构

  • Go语言编译工具对源码目录有很严格的要求,
  • 工作空间必须由bin、pkg、src三目录组成
  • bin存放可执行文件
  • pkg存放编译好的库文件,*.a文件;
  • sre存放Go语言的源文件

7 包

1.工作空间

  • Go采用工作空间来管理本地代码,这与大部分编程语言不一样
  • GOROOT是全局且唯一的变量,指定存放Go语言本身的目录路径(安装路径)
  • GOPATH是工作空间的变量,可有很多个(用;号分隔),用于指定工作空间的目录路径。

7 包

  • go get会用第一个工作空间保存下载的第三方库(包),
    • 开发时不管哪个工作空间下载的包都可以在任意工作空间使用
  • 尽量不要把GOROOT和 GOPATH设置为同一个路径
  • 包的源代码书写与正常的Go语言没有区别,文件必须UTF-8