Files
the-way-to-go_ZH_CN/eBook/09.1.md
2015-08-05 11:28:01 +08:00

97 lines
4.3 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 9.1 标准库概述
`fmt``os` 等这样具有常用功能的内置包在 Go 语言中有 150 个以上,它们被称为标准库,大部分(一些底层的除外)内置于 Go 本身。完整列表可以在 [Go Walker](https://gowalker.org/search?q=gorepos) 查看。
在贯穿本书的例子和练习中,我们都是用标准库的包。可以通过查阅第 350 页包中的内容快速找到相关的包的实例。这里我们只是按功能进行分组来介绍这些包的简单用途,我们不会深入讨论他们的内部结构。
- `unsafe`: 包含了一些打破 Go 语言“类型安全”的命令,一般的程序中不会被使用,可用在 C/C++ 程序的调用中。
- `syscall`-`os`-`os/exec`:
- `os`: 提供给我们一个平台无关性的操作系统功能接口采用类Unix设计隐藏了不同操作系统间差异让不同的文件系统和操作系统对象表现一致。
- `os/exec`: 提供我们运行外部操作系统命令和程序的方式。
- `syscall`: 底层的外部包,提供了操作系统底层调用的基本接口。
通过一个 Go 程序让Linux重启来体现它的能力。
示例 9.1 [reboot.go](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`:
- `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`: 双链表。
下面代码演示了如何遍历一个链表(当 l 是 `*List`)
```go
for e := l.Front(); e != nil; e = e.Next() {
//do something with e.Value
}
```
- `ring`: 环形链表。
- `time`-`log`:
- `time`: 日期和时间的基本操作。
- `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`: 实现通过程序运行时反射,让程序操作任意类型的变量。
`exp` 包中有许多将被编译为新包的实验性的包。它们将成为独立的包在下次稳定版本发布的时候。如果前一个版本已经存在了,它们将被作为过时的包被回收。然而 Go1.0 发布的时候并不包含过时或者实验性的包。
**练习 9.1**
使用 `container/list` 包实现一个双向链表,将 101、102 和 103 放入其中并打印出来。
**练习 9.2**
通过使用 `unsafe` 包中的方法来测试你电脑上一个整型变量占用多少个字节。
## 链接
- [目录](directory.md)
- 上一节:[package](09.0.md)
- 下一节:[regexp 包](09.2.md)