学习资料来自
GitHub - unknwon/the-way-to-go_ZH_CN: 《The Way to Go》中文译本,中文正式名《Go 入门指南》
1、Map
1)Map可用函数或切片和数组(用于一个key对应多个value的情况)作为 value
2)是引用类型
3)长度可动态改变,不用new进行初始化(会返回空指针 nil)
4)判断键值对是否存在
_, ok := map1[key1] // 如果key1存在则ok == true,否则ok为false
if _, ok := map1[key1]; ok { // 可以结合if进行判断
// ...
}
delete(map1, key1) // 删除指定键值
5)可构建map类型的切片,初始化举例
items := make([]map[int]int, 5)
for i:= range items {
items[i] = make(map[int]int, 1)
items[i][1] = 2
}
// 注意:for-range结构第一个值返回索引,第二个返回具体值
// 忽略索引值时使用_ ;忽略具体值时直接使用 i:=range
6)map 默认不进行排序操作
7)map 非线程安全
2、packge包
1)相关标准库
包 | 用途 |
unsafe | 打破 Go 语言“类型安全”的命令,一般的程序中不会被使用,可用在 C/C++ 程序的调用 |
os | 平台无关性的操作系统功能接口,采用类 Unix 设计,隐藏了不同操作系统间的差异,让不同的文件系统和操作系统对象表现一致 |
os/exec | 运行外部操作系统命令和程序的方式 |
syscall | 底层的外部包,提供操作系统底层调用的基本接口 |
archive/tar和archive/zip-compress | 压缩(解压缩)文件 |
fmt | 格式化输入输出功能 |
io | 基本输入输出功能,大多数是围绕系统功能的封装 |
bufio | 缓冲输入输出功能的封装 |
path/filepath | 操作在当前系统中的目标文件名路径 |
flag | 对命令行参数操作 |
strings | 提供对字符串的操作 |
strconv | 将字符串转换为基础类型 |
unicode | 为 unicode 型的字符串提供特殊的功能 |
regexp | 正则表达式功能 |
bytes | 对字符型分片的操作 |
index/suffixarray | 子字符串快速查询 |
math | 基本的数学函数 |
math/cmath | 复数的操作 |
math/rand | 伪随机数生成 |
sort | 为数组排序和自定义集合 |
math/big | 大数的实现和计算 |
container/list | 双链表,链表遍历方法如下( l=*List ): for e := l.Front(); e != nil; e = e.Next() {} |
container/ring | 环形链表 |
time | 日期和时间的基本操作 |
log | 记录程序运行时产生的日志 |
encoding/json | 读取并解码和写入并编码 JSON 数据 |
encoding/xml | XML1.0 解析器 |
text/template | 生成像 HTML 一样的数据与文本混合的数据驱动模板 |
net | 网络数据的基本操作 |
http | 可扩展的 HTTP 服务器和基础客户端,解析 HTTP 请求和回复 |
runtime | Go 程序运行时的交互操作,例如垃圾回收和协程创建 |
reflect | 实现通过程序运行时反射,让程序操作任意类型的变量 |
2)regexp包
(1)单纯的正则表达式匹配:ok, _ := regexp.Match(pat, []byte(searchIn))
或 ok, _ := regexp.MatchString(pat, searchIn)
(2)涉及到正则表达式替换等功能时 通过 Compile 方法返回 Regexp 对象(补:正则表达式有误返回错误,MustCompile在正则表达式无效时程序 panic)
3)sync包(锁机制)
(1)互斥锁:sync.Mutex 守护临界区
(2)共享变量存放于同一个 struct 中,该struct中加入Mutex锁
(3)RWMutex:RLock()方法允许多个线程同时读但仅一个写
4)big包
(1)大整数:big.Int;大有理数:big.Rat(含Mul,Add以及Div等运算)
5)自定义包
(1)文件名:不含 _ 的小写单词
(2)导入本地包: import "包的路径或 URL 地址"
6)导入外部安装包:go install 在本地位置安装
7)包初始化:分配初始值给所有的包级变量和调用源码中定义的包级 init 函数来初始化
(1)init 函数不能被调用
(2)一个包可能有多个 init 函数甚至在一个源码文件中,它们无序执行
8)不同包存放在不同的目录下,每个包(所有属于这个包中的 go 文件)都存放在和包名相同的子目录下
9)已有常用外部包
(1)数据库
包名 | 针对的数据库 |
GoMySQL | MySQL |
go-pgsql | PostgreSQL |
mgo, gomongo | MongoDB |
couch-go | CouchDB |
godbcl | ODBC |
redis.go | Redis |
gosqlite | SQLite3 |
(2)SDL bindings
(3)goprotobuf :Google's Protocal Buffers
(4)go-xmlrpc :XML-RPC
(5)twitterstream :Twitter
(6)GoAuth :OAuth libraries