近期学习《the way to go》这本书,觉得非常清晰和易懂,故作为读书笔记,记录一下总结。
一、go 程序编译
二、go 包和文件
2.1 包
- 包是结构化代码的一种方式: 每个程序都由包( 通常简称为 pkg) 的概念组成, 可以使用自身的包或者从其它包中导入内容。
如同其它一些编程语言中的类库或命名空间的概念, 每个 Go 文件都属于且仅属于一个包。 一个包可以由许多以.go 为扩展名的源文件组成, 因此文件名和包名一般来说都是不相同的。
- 每个go文件必须属于1个包,在源文件中非注释的第一行指明这个文件属于哪个包, 如: package main
package xxx xxx
- package main 表示一个可独立执行的程序, 每个 Go 应用程序都包含一个名为 main 的包。
- main包和非main包的区别在于,main包会构建成可执行的程序,非main包会构建成模块(以.a后缀结尾)。
- 所有的包名都应该使用小写字母。
- 包的依赖关系决定了其构建顺序。
- 属于同一个包的源文件必须全部被一起编译, 一个包即是编译时的一个单元, 因此根据惯例, 每个目录都只包含一个包。
- 如果对一个包进行更改或重新编译, 所有引用了这个包的客户端程序都必须全部重新编译。
2.2 标准库
- Go安装包里面就包含了标准库,标准库包含了大量的包( 如: fmt 和 os) , 但是你也可以创建自己的包。
2.3 自定义包
三、go标准库
- go语言的标准库,也是以包的形式进行使用。
像 fmt 、 os 等这样具有常用功能的内置包在 Go 语言中有 150 个以上, 它们被称为标准库, 大部分(一些底层的除外)内置于 Go 本身。
查看标准库:
- 常用标准库的大概功能
os : 提供给我们一个平台无关性的操作系统功能接口, 采用类Unix设计, 隐藏了不同操作系统间差异, 让不同的文件系统和操作系统对象表现一致。
os/exec : 提供我们运行外部操作系统命令和程序的方式。syscall : 底层的外部包, 提供了操作系统底层调用的基本接口
syscall : 底层的外部包, 提供了操作系统底层调用的基本接口。
archive/tar 和 /zip-compress : 压缩(解压缩)文件功能。fmt - io - bufio - path/filepath - flag :
fmt : 提供了格式化输入输出功能。
io : 提供了基本输入输出功能, 大多数是围绕系统功能的封装。bufio : 缓冲输入输出功能的封装。
path/filepath : 用来操作在当前系统中的目标文件名路径。flag : 对命令行参数的操作。
strings - strconv - unicode - regexp - bytes :
strings : 提供对字符串的操作。
strconv : 提供将字符串转换为基础类型的功能。unicode : 为 unicode 型的字符串提供特殊的功能。regexp : 正则表达式功能。
bytes : 提供对字符型分片的操作。index/suffixarray : 子字符串快速查询。
math - math/cmath - math/big - math/rand - sort :
math : 基本的数学函数。math/cmath : 对复数的操作。math/rand : 伪随机数生成。
sort : 为数组排序和自定义集合。math/big : 大数的实现和计算。
container - /list-ring-heap : 实现对集合的操作。
list : 双链表。
ring : 环形链表。
log : 记录程序运行时产生的日志,我们将在后面的章节使用它。encoding/json - encoding/xml - text/template :
encoding/json : 读取并解码和写入并编码 JSON 数据。
encoding/xml :简单的 XML1.0 解析器,有关 JSON 和 XML 的实例请查阅第 12.9/10 章节。text/template :生成像 HTML 一样的数据与文本混合的数据驱动模板( 参见第 15.7 节) 。
net - net/http - html :( 参见第 15 章) net : 网络数据的基本操作。
http : 提供了一个可扩展的 HTTP 服务器和基础客户端, 解析 HTTP 请求和回复。html : HTML5 解析器。
runtime : Go 程序运行时的交互操作, 例如垃圾回收和协程创建。
reflect : 实现通过程序运行时反射, 让程序操作任意类型的变量
regexp:正则表达式包
sync:并发包,其中包含 Mutex 、RWMutex两种常用的类型。操作方法分别是Lock/Unlock,RLock.
相对简单的情况下, 通过使用 sync 包可以解决同一时间只能一个线程访问变量或 map 类型数据的问题。 如果这种方式导致程序明显变慢或者引起其他问题, 我们要重新思考来通过 goroutines 和 channels 来解决问题, 这是在 Go 语言中所提倡用来实现并发的技术。
big: 超过float64 等这些大数值计算的包
浙公网安备 33010602011771号