Go扩展包(十八):encoding-json
1. 介绍
Go的标准包 encoding/json实现了json对象的编码和解码。
这篇文章主要讲的是结构体中嵌套匿名字段时的序列化和反序列化,因结构体在参与序列时会有很多细节规则,平时常用的也是结构体,至于map和slice可参考历史文章 Go学习(二十三):JSON编码解析使用
1.1 Go和JSON数据类型
JSON
Go
Boolean
bool
Number
float64
String
string
Array
[]interface{}
Object
map[string]interface{}
NULL
nil
1.2 结构体序列化规则@注意:可导出的字段(首字母大写),才能参与Json的序列化
标签
json的key
有标签,json:"xx"
key=xx
无标签
key=结构体原属性字段
有标签,json:"-"
会被忽略,不参与序列化
有标签,json:"xxx,omitempty" ...
Go扩展包(十七):crypto-rsa
1. 维基百科释义RSA加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用。RSA是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。
2.生成密钥RSA私钥存在PKCS1和PKCS8两种格式,通过openssl生成的私钥格式为PKCS1,公钥格式为PKCS8。
2.1 使用openssl命令1.生成私钥(PKCS1格式)1234567891011121314151617181920212223# 生成私钥➜ openssl genrsa -out private_ssl.pem 1024Generating RSA private key, 1024 bit long modulus.......++++++.............................................++++++e is 65537 (0x10001)# 查看私钥➜ cat private ...
Go扩展包(十六):crypto-aes
1.介绍高级加密标准(英语:Advanced Encryption Standard,缩写:AES),又称Rijndael加密法(荷兰语发音:[ˈrɛindaːl],音似英文的“Rhine doll”),是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。现在,高级加密标准已然成为对称密钥加密中最流行的算法之一。
该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael为名投稿高级加密标准的甄选流程。
2. 电码本模式(ECB)2.1 加密a.代码123456789101112131415161718192021222324252627282930313233// 加密func AesEncryptByECB(data, key string) string { // 判断key长度 keyLenMa ...
Go扩展包(十五):os
1.介绍os包中提供了操作系统函数的接口,是一个比较重要的包。它的作用主要是在服务器上进行系统的基本操作,如文件操作、目录操作、执行命令、信号与中断、进程、系统状态等等。下面分模块归纳一些常用函数。
2. 系统信息2.1 函数列表
函数
功能
Hostname()
获取当前主机名
Getpid()
返回调用者所在进程的进程ID
Getppid()
返回调用者所在进程的父进程的进程ID
Exit()
让程序以状态码code退出。状态码0表示成功,非0表示出错。code取值范围: [0,125]
2.2 代码示例a. 示例一
12345678910// 系统相关func TestSystemInfo(t *testing.T) { hostname, _ := os.Hostname() // 主机名: huideMacBook-Pro.local fmt.Printf("主机名:%v \n", hostname) // 调用者所在进程的进程ID: 42862 fmt.Printf("调用者所在进程的进程ID: %v \n& ...
Go扩展包(十四):bigCache
1. 介绍BigCache 是一个快速,支持并发访问,自淘汰的内存型缓存,可以在存储大量元素的同时依然保持高性能。BigCache将元素保存在堆上却避免了GC的开销。源码地址:https://github.com/allegro/bigcache
1.1 为什么开发bigcache?bigcache团队接到一个任务,需要开发一个非常快速的缓存服务,并满足以下几点需求:
使用 HTTP 协议处理请求。
处理10k rps (写5000,读5000)。
cache对象至少存活10分钟。
更快的响应时间。
POST请求的每条 JSON 消息,一有含有ID,二不大于500字节.
POST请求添加缓存后,GET能获取到最新结果。
简单地说,我们的任务是编写一个带有过期和 REST 接口的快速字典。
1.2 为什么不用第三方服务?为了满足上述任务需求,要求开发的cache库要保证:
即使有百万的缓存对象也要非常快
支持大并发访问
一定时间后支持剔除
官方原文:
Considering the first point we decided to give up external cac ...
Go扩展包(十三):zap
1.介绍Zap是uber开源的日志库,支持日志级别分级 、结构化记录,对性能和内存分配做了极致的优化。目前 Star 12.8 源码地址: https://github.com/uber-go/zap
官方性能测试图
2.安装1go get -u go.uber.org/zap
3.日志记录器Zap提供了两种类型的日志记录器: SugaredLogger和Logger,两者对比如下:
SugaredLogger : 在性能很好但不是很关键的上下文中使用,它比其他结构化日志记录包快4-10倍,并且支持结构化和printf风格的日志记录。与 log15和 go-kit 一样,SugaredLogger 的结构化日志 api 类型灵活,并接受可变的键值对的数量。
Logger : 在每一微秒和每一次内存分配都很重要的上下文中,使用Logger。它甚至比SugaredLogger更快,内存分配次数也更少,但它只支持强类型的结构化日志记录。
4.创建Logger4.1 创建Logger几种方式在Zap中通过调用zap.NewProduction()、zap.NewDevelopment() ...
Go扩展包(十二):unicode
1.介绍unicode包提供了诸多处理rune字符相关功能的函数(比如区分字母和数字,或者是字母的大写和小写转换等)
2.判断函数2.1 是否为空格(IsSpace)12345678func TestJudge(t *testing.T) { rune1 := ' ' rune2 := 'h' fmt.Printf("[%c] 是空格? %t\n",rune1,unicode.IsSpace(rune1)) // 输出 [ ] 是空格? true fmt.Printf("[%c] 是空格? %t\n",rune2,unicode.IsSpace(rune2)) // 输出 [h] 是空格? false}
2.2 是否为十进制数(IsDigit)123456d1 := '1'd2 := 'w'fmt.Printf("[%c] 是十进制数? %t\n",d1,unicode.IsDigit(d1))// 输出: [1] 是十进 ...
Go扩展包(十一):sort
1.介绍sort包实现了四种基本排序算法:插入排序、归并排序、堆排序、快速排序。 但是这四种排序方法是不公开的,它们只能在 sort 包内部使用。sort 包会根据实际数据自动选择高效的排序算法,所以在对数据集合排序时不必考虑应当选择哪一种排序方法,只要实现了 sort.Interface 定义的三个方法,就可以顺利对数据集合进行排序:
Len() int: 获取数据集合长度。
Less() bool: 比较两个元素大小。
Swap(): 交换两个元素位置。
1.1 支持功能sort 包对[]int 、[]float64 、[]string 切片提供了完整的支持,主要功能有:
对基本数据类型切片的排序。
基本数据元素查找。
判断基本数据类型切片是否已经排序。
对排好序的数据集合逆序。
2.排序2.1 T.Sorta. 使用方法12345678910// 步骤1.定义相关类型 sort.IntSlice/Float64Slice/StringSlicesliceExample := T{..,..,..}// 步骤2.调用排序方法sliceExample.So ...
Go扩展包(十):viper
1.介绍Viper是适用于Go应用程序(包括Twelve-Factor App)的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。目前Star 15.8k,它支持以下特性:
设置默认值
从JSON、TOML、YAML、HCL、envfile和Java properties格式的配置文件读取配置信息
实时监控和重新读取配置文件(可选)
从环境变量中读取
从远程配置系统(etcd或Consul)读取并监控配置变化
从命令行参数读取配置
从buffer读取配置
显式配置值
2.安装1go get github.com/spf13/viper
3. 读取yamlviper可以解析JSON、TOML、YAML、HCL、envfile、properties多种格式的配置文件,这里只演示yaml格式的解析,其他格式与此类似。
3.1 创建yaml文件新建./app.yaml文件,内容如下:
12345678app: name: Gin框架学习实践 version: v1.0mysql: host: 127.0.0.1 port: 3306 use ...
Go扩展包(九):flag
1.介绍在 Go中,如果要接收命令行参数,需要使用 flag包进行解析。不同的参数类型可以通过不同的方法接收。
2.参数接受2.1 接受方式使用flag接收参数,可以由以下三种方式接受:
方式一: flag.Type(name,defaultVal,desc)
方式二: flag.TypeVar(&flagVar,name,defaultVal,desc)
方式三: flag.Var(&flagVar,name,desc)
方式四: flag.Args()
方式五:flag.Arg(i)
字段
说明
flag.Type
这里的Type是个抽象的概念,不是具体函数名
name
代表输入参数名
defaultVal
默认值
desc
描述信息
2.2 注意事项
上面接收方式一、二、三,都是最后调用flag.Parse(),而方式四和方式五是提前调用flag.Parse()。
方式一、二、三传参时,注意布尔类型,尽量设置成-flag=val,否则会影响后面的参数解析。
方式四、五不能使用-flag=val这种格式传参。
3.flag.Type ...
Go扩展包(八):sync
1.介绍sync包提供了互斥锁。除了Once和WaitGroup类型,其余多数适用于低水平的程序,多数情况下,高水平的同步使用channel通信性能会更优一些。
2.并发等待组(WaitGroup)WaitGroup,即等待一组Goroutine结束。父Goroutine调用Add()方法来设置应等待Goroutine的数量。每个被等待的Goroutine在结束时应该调用Done()方法。与此同时,主Goroutine可调用Wait()方法阻塞至所有Goroutine结束。
2.1 WaitGroup结构12345// A WaitGroup must not be copied after first use.type WaitGroup struct { noCopy noCopy state1 [3]uint32}
2.2 方法列表
方法名
功能
(wg *WaitGroup) Add(delta int)
等待组的计数器 +1
(wg *WaitGroup) Done()
等待组的计数器 -1
(wg *WaitGroup) ...
Go扩展包(七):context(上下文)
1.什么是上下文?从Go 1.7开始,标准库引入context(上下文),他主要用来在goroutine之间传递上下文信息(同步信号、超时时间、截止时间、Key-Val值对)。
2. 为什么要用上下文?2.1 场景说明在实际开发过程中,我们往往会在main.goroutine(主协程)中开启N 个goroutine(子协程)来处理其他逻辑,那么主协程和 子协程之间信号怎么同步呢?列举以下几个需要信号同步的场景。
当主协程报错或者因为其他原因需要取消时,需要通知子协程取消任务。
创建子协程时,希望指定超时时间或截止时间后,自动取消任务。
2.2 怎么解决?context 包提供了一些函数,协助用户从现有的 Context 对象创建新的 Context 对象。这些 Context 对象形成一棵树:当一个 Context 对象被取消时,继承自它的所有 Context 都会被取消。
Background 是所有 Context 对象树的根,它不能被取消。
3. 上下文接口context包中定义了一个接口context.Context,具体定义代码如下:
1234567891011121 ...
Go扩展包(六):bufio(有缓冲的IO)
1.介绍bufio包实现了有缓冲的I/O。它包装一个io.Reader或io.Writer接口对象,使用这个包可以大幅提高文件读写的效率。
1.如何提高效率?
1.写入流程梳理:
当写入内容小于缓冲区(buf)的可用大小时,内容写入缓冲区(buf);
当缓冲区(buf)空间不够时,一次性将缓冲区(buf)内容写入文件,并清空缓冲区(buf);
当写入内容大于缓冲区(buf)空间时,将内容直接写入文件;
2.读取流程梳理:
当读取内容小于缓冲区(buf)空间时,从缓冲区(buf)读取;
当缓冲区(buf)内容为空时,一次性从文件中读取大小等于缓冲区(buf)的内容;
当读取内容大于缓冲区(buf)空间时,直接读取文件;
总结: 避免频繁操作文件、减少访问本地磁盘次数,从而提高效率。
2.读取(Read*)2.1 创建读取器1. 创建默认缓冲大小 (NewReader)a.签名1func NewReader(rd io.Reader) *Reader
根据rd创建一个具有默认大小缓冲的*Reader。默认大小:4096字节
b.使用123reader := bufio.New ...
Go扩展包(五):ioutil(IO操作函数集)
1.介绍在Go语言中,io包主要声明的是对I/O操作的基本接口,而io/ioutil包则实现了对应的方法,方便我们直接使用。
2.方法列表
方法名
描述
NopCloser
对Reader进行封装,返回一个ReadCloser
ReadAll
对 Reader 进行读取, 直到发生错误或者遇到 EOF 为止, 然后返回被读取的数据。
ReadFile
读取指定文件的内容,并返回。
ReadDir
读取 指定的目录, 并返回排序后的目录列表(根据名称排序)
TempDir
在指定目录新创建一个临时目录, 并返回该目录的路径
TempFile
在指定目录新创建一个临时文件, 以可读写的方式打开它, 并返回 *os.File 指针
WriteFile
将给定的数据 写入到指定文件里面。 如果文件不存在, 则去创建它; 如果文件已经存在, 则再写入之前会先清空文件中已有的内容。
3.ReadAll3.1 方法签名1func ReadAll(r io.Reader) ([]byte, error)
ReadAll从r读取数据直到EOF或error,返回读 ...
Go扩展包(四):fmt(格式化输出)
1.输出控制台1.1 PrintfPrintf根据format参数生成格式化的字符串并写入标准输出。返回写入的字节数和遇到的任何错误。
1.format格式
动 词
功 能
%v
按值的本来值输出
%+v
在 %v 基础上,对结构体字段名和值进行展开
%#v
输出 Go 语言语法格式的值
%T
输出 Go 语言语法格式的类型和值
%%
输出 % 本体
%b
整型以二进制方式显示
%o
整型以八进制方式显示
%d
整型以十进制方式显示
%x
整型以十六进制方式显示
%X
整型以十六进制、字母大写方式显示
%U
Unicode 字符
%f
浮点数
%p
指针,十六进制方式显示
%c
数值对应的 Unicode 编码字符
%s
直接输出字符串或者[]byte
%t
输出值的 true 或 false
2.打印字符串1234567str := "hello word"fmt.Printf("%%s-> %s \n",str)fmt.Printf ...