> For the complete documentation index, see [llms.txt](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ryanyang.gitbook.io/the-way-to-go-zh-cn/di-er-bu-fen-yu-yan-de-he-xin-jie-gou-yu-ji-shu/09.0/09.1.md).

# 标准库概述

像 `fmt`、`os` 等这样具有常用功能的内置包在 Go 语言中有 150 个以上，它们被称为标准库，大部分(一些底层的除外)内置于 Go 本身。完整列表可以在 [Go Walker](https://gowalker.org/search?q=gorepos) 查看。

在贯穿本书的例子和练习中，我们都是用标准库的包。可以通过查阅第 350 页包中的内容快速找到相关的包的实例。这里我们只是按功能进行分组来介绍这些包的简单用途，我们不会深入讨论他们的内部结构。

* `unsafe`: 包含了一些打破 Go 语言“类型安全”的命令，一般的程序中不会被使用，可用在 C/C++ 程序的调用中。
* `syscall`-`os`-`os/exec`: &#x20;
  * `os`: 提供给我们一个平台无关性的操作系统功能接口，采用类Unix设计，隐藏了不同操作系统间差异，让不同的文件系统和操作系统对象表现一致。 &#x20;
  * `os/exec`: 提供我们运行外部操作系统命令和程序的方式。 &#x20;
  * `syscall`: 底层的外部包，提供了操作系统底层调用的基本接口。

通过一个 Go 程序让Linux重启来体现它的能力。

示例 9.1 [reboot.go](https://github.com/yangchuansheng/the-way-to-go_ZH_CN/tree/f30ab7d8c58f85840a0afb548024b93642b518d5/eBook/examples/chapter_9/reboot.go)：

```go
package main
import (
    "syscall"
)

const LINUX_REBOOT_MAGIC1 uintptr = 0xfee1dead
const LINUX_REBOOT_MAGIC2 uintptr = 672274793
const LINUX_REBOOT_CMD_RESTART uintptr = 0x1234567

func main() {
    syscall.Syscall(syscall.SYS_REBOOT,
        LINUX_REBOOT_MAGIC1,
        LINUX_REBOOT_MAGIC2,
        LINUX_REBOOT_CMD_RESTART)
}
```

* `archive/tar` 和 `/zip-compress`：压缩(解压缩)文件功能。
* `fmt`-`io`-`bufio`-`path/filepath`-`flag`: &#x20;
  * `fmt`: 提供了格式化输入输出功能。 &#x20;
  * `io`: 提供了基本输入输出功能，大多数是围绕系统功能的封装。 &#x20;
  * `bufio`: 缓冲输入输出功能的封装。 &#x20;
  * `path/filepath`: 用来操作在当前系统中的目标文件名路径。 &#x20;
  * `flag`: 对命令行参数的操作。　　
* `strings`-`strconv`-`unicode`-`regexp`-`bytes`: &#x20;
  * `strings`: 提供对字符串的操作。 &#x20;
  * `strconv`: 提供将字符串转换为基础类型的功能。
  * `unicode`: 为 unicode 型的字符串提供特殊的功能。
  * `regexp`: 正则表达式功能。 &#x20;
  * `bytes`: 提供对字符型分片的操作。 &#x20;
  * `index/suffixarray`: 子字符串快速查询。
* `math`-`math/cmath`-`math/big`-`math/rand`-`sort`: &#x20;
  * `math`: 基本的数学函数。 &#x20;
  * `math/cmath`: 对复数的操作。 &#x20;
  * `math/rand`: 伪随机数生成。 &#x20;
  * `sort`: 为数组排序和自定义集合。 &#x20;
  * `math/big`: 大数的实现和计算。  　　
* `container`-`/list-ring-heap`: 实现对集合的操作。 &#x20;
  * `list`: 双链表。
  * `ring`: 环形链表。

下面代码演示了如何遍历一个链表(当 l 是 `*List`)：

```go
for e := l.Front(); e != nil; e = e.Next() {
    //do something with e.Value
}
```

* `time`-`log`: &#x20;
  * `time`: 日期和时间的基本操作。 &#x20;
  * `log`: 记录程序运行时产生的日志,我们将在后面的章节使用它。
* `encoding/json`-`encoding/xml`-`text/template`:
  * `encoding/json`: 读取并解码和写入并编码 JSON 数据。 &#x20;
  * `encoding/xml`:简单的 XML1.0 解析器,有关 JSON 和 XML 的实例请查阅第 12.9/10 章节。 &#x20;
  * `text/template`:生成像 HTML 一样的数据与文本混合的数据驱动模板（参见第 15.7 节）。 &#x20;
* `net`-`net/http`-`html`:（参见第 15 章）
  * `net`: 网络数据的基本操作。 &#x20;
  * `http`: 提供了一个可扩展的 HTTP 服务器和基础客户端，解析 HTTP 请求和回复。 &#x20;
  * `html`: HTML5 解析器。 &#x20;
* `runtime`: Go 程序运行时的交互操作，例如垃圾回收和协程创建。 &#x20;
* `reflect`: 实现通过程序运行时反射，让程序操作任意类型的变量。 &#x20;

`exp` 包中有许多将被编译为新包的实验性的包。它们将成为独立的包在下次稳定版本发布的时候。如果前一个版本已经存在了，它们将被作为过时的包被回收。然而 Go1.0 发布的时候并不包含过时或者实验性的包。

**练习 9.1**

使用 `container/list` 包实现一个双向链表，将 101、102 和 103 放入其中并打印出来。

**练习 9.2**

通过使用 `unsafe` 包中的方法来测试你电脑上一个整型变量占用多少个字节。

## 链接

* [目录](https://github.com/yangchuansheng/the-way-to-go_ZH_CN/tree/f30ab7d8c58f85840a0afb548024b93642b518d5/eBook/directory.md)
* 上一节：[包（package）](/the-way-to-go-zh-cn/di-er-bu-fen-yu-yan-de-he-xin-jie-gou-yu-ji-shu/09.0.md)
* 下一节：[regexp 包](/the-way-to-go-zh-cn/di-er-bu-fen-yu-yan-de-he-xin-jie-gou-yu-ji-shu/09.0/09.2.md)
