|
@@ -1,95 +1,95 @@
|
|
|
-#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包中的方法来测试你电脑上一个整型变量占用多少个字节。
|
|
|
|
|
-
|
|
|
|
|
-##链接
|
|
|
|
|
|
|
+# 9.1 标准库概述
|
|
|
|
|
+
|
|
|
|
|
+像 fmt,os 等这样具有常用功能的内置包在 Go 语言中有 150 个以上,它们被称为标准库,大部分(一些底层的除外)内置于 Go 本身。记录在: http://golang.org/pkg/。
|
|
|
|
|
+
|
|
|
|
|
+在贯穿本书的例子和练习中,我们都是用标准库的包。可以通过查阅第 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):
|
|
|
|
|
+
|
|
|
|
|
+```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)
|
|
- [目录](directory.md)
|
|
|
-- 上一节:
|
|
|
|
|
-- 下一节:[regexp包](09.2.md)
|
|
|
|
|
-
|
|
|
|
|
|
|
+- 上一节:[包(package)](09.0.md)
|
|
|
|
|
+- 下一节:[regexp 包](09.2.md)
|