Go学习笔记
标准库
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: 环形链表。
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: 实现通过程序运行时反射,让程序操作任意类型的变量。
练习 9.1 Q20_linked_list.go
使用 container/list 包实现一个双向链表,将 101、102 和 103 放入其中并打印出来。
package main
import (
"container/list"
"fmt"
)
func main() {
a := [3]int{101, 102, 103}
s := list.New()
for i := 0; i < len(a); i++ {
s.PushBack(a[i])
}
for e := s.Front(); e != nil; e = e.Next() {
fmt.Print(e.Value, "\n")
}
}
练习 9.2 size_int.go
通过使用 unsafe 包中的方法来测试你电脑上一个整型变量占用多少个字节。
package main
import (
"fmt"
"unsafe"
)
func main() {
var a int = 10
res := unsafe.Sizeof(a)
fmt.Print(res)
}
结果:
自定义包
练习 9.3 main_greetings.go
创建一个程序 main_greetings.go 能够和用户说 “Good Day” 或者 “Good Night”。不同的问候应该放到单独的 greetings 包中。
在同一个包中创建一个 IsAM 函数返回一个布尔值用来判断当前时间是 AM 还是 PM,同样创建 IsAfternoon 和 IsEvening 函数。
使用 main_greetings 作出合适的问候(提示:使用 time 包)。
包结构:
package greeting
import "fmt"
func SayAfternoon() {
fmt.Print("good afternoon\n")
}
package greeting
import "fmt"
func SayEvening() {
fmt.Print("good evening\n")
}
package greeting
import "fmt"
func SayMorning() {
fmt.Print("good morning\n")
}
package main
import (
"awesomeProject/greeting"
"fmt"
"time"
)
func main() {
t := time.Now()
fmt.Print(t, "\n")
flag := greeting.Whattime()
if flag == 0 {
greeting.SayMorning()
} else if flag == 1 {
greeting.SayAfternoon()
} else {
greeting.SayEvening()
}
}
结果:
练习 9.4
创建一个程序 main_oddven.go 判断前 100 个整数是不是偶数,将判断所用的函数编写在 even 包里。
package even
func Pan100() []int {
sl := make([]int, 0, 100)
for i := 0; i <= 100; i++ {
if i%2 == 0 {
sl = append(sl, i)
}
}
return sl
}
package main
import (
"awesomeProject/even"
"fmt"
)
func main() {
sl := even.Pan100()
fmt.Print(sl)
}
练习 9.5 使用第 6.6 节的斐波那契程序:
1)将斐波那契功能放入自己的 fibo 包中并通过主程序调用它,存储最后输入的值在函数的全局变量。
2)扩展 fibo 包将通过调用斐波那契的时候,操作也作为一个参数。实验 “+” 和 “*”
main_fibo.go / fibonacci.go