#A 标准库
#9.1 标准库概述
像fmt，os等这样具有常用功能的内置包在Go语言中有150个以上，它们被称为标准库，大部分(一些底层的除外)内置于Go本身。记录在:http://golang.org/pkg/。

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

unsafe: 包含了一些打破Go语言“类型安全”的命令，一般的程序中不会被使用，可用在C/C++程序的调用中。

syscall-os-os/exec:  
os: 提供给我们一个平台无关性的操作系统功能接口，采用类Unix设计，隐藏了不同操作系统间差异，让不同的文件系统和操作系统对象表现一致。  
os/exec: 提供我们运行外部操作系统命令和程序的方式。  
syscall: 底层的外部包，提供了操作系统底层调用的基本接口。

通过一个Go程序让Linux重启来体现它的能力(通过sudo ./6.out来执行程序):

示例 9.1 [reboot.go](examples/chapter_9/reboot.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 and /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):

	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: dlinked_list.go  
使用container/list包实现一个双向链表，将101,102,103放入其中并打印出来。 

练习9.2: size_int.go  
通过使用unsafe包中的方法来测试你电脑上一个整型变量占用多少个字节。

##链接
- [目录](directory.md)
- 上一节：
- 下一节：[regexp包](09.2.md)

