Golang 官方标准库学习
本文主要介绍Go源码中带有的所有官方标准库,很基本
内容还比较少,有机会会继续更新
什么是golang官方标准库
- 这些包一般储存在GOROOT路径下的src文件夹中,并且是以.go为后缀名的(有可能你会在pkg/中找到一些.a后缀的文件 拓展.a
例如用apt-get安装后在ubuntu下的路径:
/usr/lib/go-1.10/src
进入本体
1.net
从我们比较熟悉的网络包入手
这个包主要是与网络相关,算是Go标准库中比较大型(也比较常用的)包
主要包含了一些底层的协议实现
net包提供的函数和类型可用于使用Unix域以及网络socket通信、TCP/IP和UDP编程。
net/http
http主要包提供了HTTP客户端和服务端的实现。
包括创建服务器,路由
http目录下其他的子库:
net/http/cgi
net/http/cookiejar
net/http/fcgi
net/http/httptest
net/http/httptrace
net/http/httputil
net/http/pprof
net/url
主要与解析/处理URL有关,比如url字符串解析、编码
net目录下其他子库:
net/mail
net/rpc
net/rpc/jsonrpc
net/smtp
net/textproto
fmt
从入门到弃坑,都会使用的fmt库
fmt库主要涉及go的格式化操作,并且主要是字符串的格式化
包含最常见的格式化输入输出到控制台,当作目标函数的参数等等(debug也比较建议用log
fmt并没有再延伸的标准库log
实现简易/简单的日志服务,是并发安全的
(最主要的是还带时间哈哈哈哈
调用会打印每条日志信息的日期、时间,默认输出到标准错误。
Print系列函数包括控制台的打印(使用参考fmt包
Fatal系列函数会在写入日志信息后调用os.Exit(1)
Panic系列函数会在写入日志信息后panic
适合一般情况下日志的记录,适合一般情况下对错误的处理,适合一般情况下的debug
log目录下的子库:
log/syslogsort
方便的排序函数,主要是排序各式各样切片类型
主流的排序算法:插入排序,堆排序,快排,归并排序都有实现
并且一次排序不一定只调用一种函数,只要实现了 sort.Interface 定义的三个方法:获取数据集合长度的 Len() 方法、比较两个元素大小的 Less() 方法和交换两个元素位置的 Swap() 方法,就可以顺利对数据集合进行排序。sort 包会根据实际数据自动选择高效的排序算法。
当然,不做更多的要求的调用也很方便
还有search功能,可以同时支持更神奇的操作
PS1:sort包对不同类型的实现好像略有不同
PS2:sort包好像普通的排序不是稳定的,为此有特别提供稳定的stable函数
个人觉得是可以深入了解的库
没有子库strings
实现用于操作字符的简单函数,即主要包含针对字符串操作的函数
为某些较复杂(麻烦)日常还会经常用到的一些需求提供方便的实现
比如:字符串分割,字符串匹配系列,字符串读取以及字符串替换/修剪等等
PS1:Go 中字符串是不可变的
这个包里还声明了两个跟io包关系密切的类型:Reader和Replacer
strings包没有字库io
自然的过渡到io包
这个包经常会根其他的包联动
谈到io,自然要谈到I/O
同时,这里补充以下对Go中I/O的一点简述:
- io 为 IO 原语(I/O primitives)提供基本的接口
- io/ioutil 封装一些实用的 I/O 函数
- fmt 实现格式化 I/O,类似 C 语言中的 printf 和 scanf
- bufio 实现带缓冲I/O
io包中声明了两个很强大,很厉害的类型(接口):Reader和Writer
(其实这个包声明了很多类型,都很强的
io包中提供了供日常使用的很多读写功能,对常用资源(内存,文件等等)的读写的接口实现,使得很多操作变得简便,灵活性高(包括但不限函数间)
PS1:由于这些被接口包装的I/O原语是由不同的低级操作实现,因此,在另有声明之前不该假定它们的并行执行是安全的。
io/ioutil
这个包很实用,很实用,很方便,很方便
常用函数:
func ReadAll(r io.Reader)([]byte,error)
func ReadFile(filename string)([]byte,error)
func WriteFile(filename string,data []byte,perm os.FileMode) error
bytes
这个包主要是和Go中的[]byte类型的处理有关
string,bytes 联系蛮紧密的
因此,bytes包中有很多和strings相仿的函数,一定程度上可以参考string包学习(但其实大概没这个必要
还有两个类型Reader和Buffer
Buffer本身是一个缓存,没有底层数据,缓存的容量会根据需要自动调整errors
非常短
包含了实现创建错误值的函数(不过常见的error类型并不是在这里声明的!
只是包含了对错误的简单处理,相对的,个性化处理变得简单
很短,目录下没有子库
encoding包定义了供其它包使用的可以将数据在字节水平和文本表示之间转换的接口。encoding/gob、encoding/json、encoding/xml三个包都会检查使用这些接口。因此,只要实现了这些接口一次,就可以在多个包里使用。标准包内建类型time.Time和net.IP都实现了这些接口。接口是成对的,分别产生和还原编码后的数据。
以上是引用的官网的解释
encoding包主要是关于常用的各种数据格式的转化操作,子库包括了json,xml,csv,binary等等的转化操作
(解析和转化功能还是很强的
涉及一些和数据类型相关的知识
当然不同的类型实现方法/接收类型也很不一样
encoding目录下的子库:
encoding/ascii85
encoding/asn1
encoding/base32
encoding/base64
encoding/binary
encoding/csv
encoding/gob
encoding/hex
encoding/json
encoding/pem
encoding/xml
time
time包是关于日期时间的包,提供了时间的现实和计量等等的功能,是个强大的时间接口
PS:Go中采用公历,unix timestamp 是int64
time包目录下没有子库runtime
与Go运行时相关的实现,可以通过他的某些函数来控制goroutine
涉及计算机底层的堆栈
Go的并发很强有一部分原因与runtime的强大有关
runtime目录下的子库:
runtime/cgo
runtime/debug
runtime/pprof
runtime/race
runtime/tracesync
谈起并发,sync包也很常用
sync包提供了基本的同步基元,但Go更推荐以channel的方式实现并发控制
常用的互斥锁:Mutex
线程控制:WaitGroup
还包含了一个Pool临时对象池
sync的原子操作包含在sync/atomic下strconv(string convert)
字符串转化
strconv提供了关于字符串与其他类型转化的功能实现方法
整型:Itoa,Atio
浮点型:ParseFloat,FormatFloat
布尔型:ParseBool,FormatBool
有append系列
有Unicode和ASCII的操作
strconv目录下没有子库unicode
与unicode编码有关的基本函数
子库可以实现unicode(rune)与utf8(byte),utf16(int16)之间的转化
unicode/utf16
unicode/utf8regexp
正则表达式可能会迟到,但绝不会缺席!
regexp实现了正则表达式搜索
编译,匹配,搜索,替换
本包的正则表达式保证搜索复杂度为O(n)
很强
Regexp类型提供了多达16个方法,用于匹配正则表达式并获取匹配的结果。
就正则吧,没啥可介绍的,基本每个语言都会提供的包,而且还就很麻烦qwq
还没翻译的子包:regexp/syntax
-
database/sql
实现了对SQL的大量操作
并且官网指出了
使用sql包时必须注入(至少)一个数据库驱动。
例如
_"github.com/go-sql-driver/mysql"
这条语句将提供MySQL驱动。
具体的查询执行都是通过调用驱动实现的db接口中的方法
database/sql 提供的是抽象概念,和具体数据库无关,具体的数据库实现,有驱动来做,这样可以很方便的更换数据库。
子包database/sql/driver定义了一些接口供数据库驱动实现
os
os包提供了操作系统函数的不依赖平台的接口。设计为Unix风格的,虽然错误处理是go风格的;失败的调用会返回错误值而非错误码。通常错误值里包含更多信息。
os包主要实现与操作系统相关的函数,并且是与平台无关的。
在 Go 中,文件描述符封装在 os.File 结构中,通过 File.Fd() 可以获得底层的文件描述符:fd。
例如:文件打开关闭,新建等等
子包:
os/user
与系统用户相关的库,可用于获取登陆用户、所在祖等信息
os/signal
Unix-Like 的系统信号处理相关函数,Linux支持64中系统信号
os/exec
帮助我们实现了方便执行命令的能力hash
hash包主要是提供了不同的hash算法
PS:md5 hash算法包含在crypto/hash中
子库主要提供了不同的循环冗余校验算法
日后加密时候会用到
一些子库:
hash/adler32
hash/crc32
hash/crc64
hash/fnvhtml
html包提供了用于转义和解转义HTML文本的函数
主要是提供对html文本的处理
子包template提供了对html的模板渲染
html/templatemath
math包提供了基本的数学处理
包括数学计算,数学常量
具体实现好像是通过大量的汇编代码实现
基本有需求的时候就可以直接用
子库
math/cmplx
支持复数操作
math/big
支持高/多精度运算
math/rand
随机生成数包这个还是很常用的(支持生成多种类型
如果需要每次运行产生不同的序列,应使用Seed函数进行初始化。默认资源可以安全的用于多go程并发。
这里引用一条官方的提示,并作一下解释:同一个程序多次调用rand函数只会生成同一个随机数,这个点需要注意一下
crypto
crypto包提供了常用的加密算法
包含了常用的加密算法实现,比如最常见的公私钥加密,散列算法,各种签名算法等等
涉及算法层面很复杂,基本都是直接拿来用
基本都是提供与加密相关的函数,实际情况下,经常会于其他字符/数字处理包联动
大量的子库对应大量的加密算法
crypto/aes
crypto/cipher
crypto/des
crypto/dsa
crypto/ecdsa
crypto/elliptic
crypto/hmac
crypto/md5
crypto/rand
crypto/rc4
crypto/rsa
crypto/sha1
crypto/sha256
crypto/sha512
crypto/subtle
crypto/tls
crypto/x509
crypto/x509/pkixsyscall
硬核系统层面调用
很复杂
实现应用层和操作底层的接口不同系统之间也存在着差异
涉及架构、汇编
没有子库
bufio包实现了有缓冲的I/O。它包装一个io.Reader或io.Writer接口对象,创建另一个也实现了该接口,且同时还提供了缓冲和一些文本I/O的帮助函数的对象。
通过io.Reader或io.Writer创建新的Reader或Writer实例
没有子库
-
builtin
内部声明/定义了Go的内置类型、内置函数、内置变量
builtin 包为Go的预声明标识符提供了文档。此处列出的条目其实并不在builtin包中,对它们的描述只是为了让 godoc 给该语言的特殊标识符提供文档。
通过官网的声明来看,builtin只是个类似包含了说明文档的包,具体和Go的内部实现有关
builtin没有子包
expvar
expvar提供了可以查询Go运行时的指标记录的接口
通过HTTP在/debug/vars位置以JSON格式导出了这些变量(很多)
个人认为使用范围可以比较广的一个包,但是这个包用的人很少.......非常少
运行时会自动注册http://localhost:9090/debug/vars
(路由接口因程序而定,可以自定义
源码相对较少,没有子库context
Go上下文包
和Golang的并发有很大联系,可以帮助程序更好的控制并发,在不同的goroutine间实现安全的传递数据以及超时管理等
声明了重要的Context接口
主要应用在:控制goroutine的生命周期、使不同的Goroutine携带各自的value变量等
因为和并发关系很大,所以使用时要考虑的并发的知识要很全面
没有子库flag
flag包用于命令行解析参数
可以很酷的帮助你实现命令行操作
例如git commit -m
哈哈哈
一般可以通过这个库来实现一些基本的操作,如果需要更复杂的命令行解析方式,可以用https://github.com/urfave/cli 或者 https://github.com/spf13/cobra这两个非官方标准库
flag包没有子库
go
go包是Go语言核心工具使用的包。
有兴趣可以直接看源码....这里就直接跳过啦
go/ast
go/build
go/constant
go/doc
go/format
go/importer
go/parser
go/printer
go/scanner
go/token
go/typesdebug
debug包是Go语言中和调试有关的包
其中dwarf子包好像是主要与UNIX有关,包含很硬核的底层操作/信息,官网有pdf,有兴趣的可以下载下来看,很神奇哈哈哈,这里也是直接跳过
debug/dwarf
debug/elf
debug/gosym
debug/macho
debug/pe
debug/plan9objpath
回归正常的Go标准库,path包实现了对路径处理(这里就是官网指的斜杠分隔的路径,即通过/分隔)常用与对文件路径、URL的处理
本身篇幅较短,大概是除了error包最简单易懂的了
主要就是方便的实现一系列与路径有关的操作
这个包似乎不适合Windows的磁盘路径处理(因为不同系统,路径表示方式有所不同
而他的子包path/filepath实现了兼容的问题plugin
首先指出有的人有可能没有这个包...
因为这个包是Go1.8才被官方添加的包(可以通过go version
查看当前版本然后去官网更新),目的是增加Go本身的动态库加载能力
目前只支持Linux和MacOS
似乎使用不是那么方便,生成和使用库文件的环境有一定的要求
plugin包没有子包
reflect
(这个包其实位置应该放在前面一点的
主要包含与反射相关的函数,通过反射可以实现运行时的动态创建、修改变量、进行函数方法的调用等操作
有可能常用的两个方法:reflect.ValueOf,reflect.TypeOf
reflect包没有子库testing
testing包提供了Go中自动化测试的相关实现
与go test
命令配合使用
常用的测试方法:单元测试,基准测试,子测试
Go推荐采用表格驱动的测试方式
子包:testing/iotest
testing/quick
text
text包主要是关于文本(不同于字符串)分析
词法分析:text/scanner
tab处理:text/tabwriter
模板引擎:text/template
text/template/parseunsafe
unsafe包提供了一些跳过go语言类型安全限制的操作。
平时Go会限制一些可能导致程序运行出错的用法,通过unsafe可以突破Go的限制,包含不安全的操作
涉及底层编程
unsafe没有子包image
image实现了基本的2D图片库。
**image/color
image/color/palette
image/draw
image/gif
image/jpeg
image/pngarchive
包含文件的归档
archive/tar
压缩archive/zipcompress
主要是与压缩有关的操作,包含常见的几种压缩格式bzip2、flate、gzip、lzw、zlib
有些操作要与tar联动使用
compress/bzip2
compress/flate
compress/gzip
compress/lzw
compress/zlibmime
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮箱扩展类型
本包实现了一些和MIME有关的功能
mime/multipart
mime/quotedprintableindex
index下只有一个子包,后缀数组
suffixarrayb包通过使用内存中的后缀树实现了对数级时间消耗的子字符串搜索。
即将子字符串的查询时间复杂度下降到了logn
算是个算法包
index/suffixarray
- container
(这个涉及数据结构,放在最后来写!!!
数组、切片、映射-->内置数据结构
container中还包含了很多数据结构
堆container/heap
双向链表container/list
环链container/ring
具体的使用看源码就可以啦,平时使用也没有特别多的操作
顺便一提,以上的标准库有一部分是依赖第三方包vender的,这个也是官方所开发
除了源码中带有的这些标准库,官方还在Github上提供了很多包