Go扩展包(三十):jsoniter
1. 介绍json-iterator是一款快且灵活的JSON解析器,不但100%兼容标准库encoding/json,而且比其更快。虽然官网说比标准包encoding/json快6倍之多,但是随着Go版本的不断迭代,目前平均比encoding/json快2倍。
官网给出的性能对比结果如下:
1.1 官网性能对比图
1.2 自写程序验证12345678910➜ go-study-example git:(main) ✗ go test -bench=. test/jsoniter_test.go -benchmemgoos: darwingoarch: amd64cpu: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHzBenchmarkUnMarshalIter-12 559245 2126 ns/op 1240 B/op 39 allocs/opBenchmarkUnMarshalJson-12 218618 5390 ns/op ...
Go扩展包(二十九):go-funk
1. 介绍Go-funk 是基于反射(reflect )实现的一个现代Go工具库,封装了对slice/map/struct/string等的操作。
2. 下载1234# 下载go get github.com/thoas/go-funk# 引入import github.com/thoas/go-funk
3. 切片(slice)操作3.1 判断元素是否存在
funk.Contains: 接收任意类型。
funk.ContainsX: X代表具体类型,如:ContainsInt、ContainsString...
12345678910111213func TestExist(t *testing.T) { // 判断任意类型 fmt.Println("str->", funk.Contains([]string{"a", "b"}, "a")) // int 类型 fmt.Println("int->", funk.ContainsInt ...
Go工具(四):性能调试利器pprof(三)
1. trace说明在pprof的分析中,能够知道一段时间内的CPU占用、内存分配、协程堆栈信息。这些信息都是一段时间内数据的汇总,但是它们并没有提供整个周期内发生的事件,例如指定的Goroutines何时执行、执行了多长时间、什么时候陷入了堵塞、什么时候解除了堵塞、GC如何影响单个Goroutine的执行、STW中断花费的时间是否太长等。这就是在Go1.5之后推出的trace工具的强大之处,它提供了指定时间内程序发生的事件的完整信息,这些事件信息包括:
协程的创建、开始和结束。
协程的堵塞——系统调用、通道、锁。
网络I/O相关事件。
系统调用事件。
垃圾回收相关事件。
2. 收集trace样本收集trace文件的方式和收集pprof特征文件的方式非常相似,有两种主要的方式
2.1 调用runtime/trace包123456789// 创建文件file, _ := os.OpenFile("./trace.out", os.O_APPEND|os.O_CREATE, os.ModePerm)// 开启if err := trace.Start(fi ...
Go工具(三):性能调试利器pprof(二)
1. 调用图说明1.1 示例图
1.2 节点颜色
红色代表累计值cum为正,并且很大;
绿色代表累计值cum为负,并且很大;
灰色代表累计值cum可以忽略不计。
1.3 节点字体大小
较大的字体表示较大的当前值;
较小的字体表示较小的当前值。
1.4 边框颜色
当前值较大并且为正数时为红色;
当前值较小并且为负数时为绿色;
接近0的当前值为灰色。
1.5 箭头大小
箭头越粗代表当前的路径消耗了越多的资源;
箭头越细代表当前的路径消耗了越少的资源。
1.6 箭头类型
虚线箭头表示两个节点之间的某些节点已被忽略,为间接调用;
实线箭头表示两个节点之间为直接调用。
2. 火焰图说明2.1 示例图
2.2 含义说明
最上方的root框代表整个程序的开始,其他的框都代表一个函数。
火焰图每一层中的函数都是平级的,下层函数是其对应的上层函数的子函数。
函数调用栈越长,火焰就越高。
框越长、颜色越深,代表当前函数占用资源越多。
可以单击任何框,查看该函数更详细的信息。
排查三步曲: top: 根据资源排序; list:查看具体代码信息;web:在浏览器中打开调用图
3. 排查内存占用 ...
Go工具(二):性能调试利器pprof(一)
1. 介绍Go语言中的pprof指对于指标或特征的分析(Profiling),通过分析不仅可以查找到程序中的错误(内存泄漏、race冲突、协程泄漏),也能对程序进行优化(例如CPU利用率不足)。
由于Go语言运行时的指标不对外暴露,因此有标准库net/http/pprof和runtime/pprof用于与外界交互。其中net/http/pprof提供了一种通过http访问的便利方式,用于用户调试和获取样本特征数据。
对特征文件进行分析要依赖谷歌推出的分析工具pprof,该工具在Go安装时即存在。
2. 收集样本在通过pprof进行特征分析时,需要执行两个步骤:收集样本和分析样本
pprof 采样数据主要有三种获取方式:
net/http/pprof: 通过 http 服务获取Profile采样文件,简单易用,适用于对应用程序的整体监控。底层也是通过 runtime/pprof 实现。
runtime/pprof: 手动调用runtime.StartCPUProfile或者runtime.StopCPUProfile等 API来生成和写入采样文件,灵活性更高。
go test: ...
Go扩展包(二十八):cobra
介绍cobra是一个用来构建现代CLI工具的库。相比flag标准库,它提供更多方便的特性和功能。Cobra 由 Go 项目成员和 hugo作者 spf13 创建,已经被许多流行的 Go项目采用,比如 GitHub CLI和 Docker CLI。
源码地址: https://github.com/spf13/cobra,截止到现在`Star 23.8K`
特性预览
使用cobra add cmdname可快速的创建子命令cli
全局、局部和级联的标志
自动生成commands和flags的帮助信息
自动识别 -h、--help 等帮助标识
支持自定义帮助信息,用法等的灵活性。
可与viper 紧密集成
相关概念Cobra 结构由三部分组成:命令 (commands)、参数 (arguments)、标志 (flags)。最好的应用程序在使用时读起来像句子,要遵循的模式:
1234# 没有子命令`app cmd --param=?`: # 有子命令`app cmd subCmd --param=?`
app:代表编译后的文件名, cmd:代表命令 subCmd:代表子命 ...
Go扩展包(二十七):cron
1.介绍在Linux中,通过crontab命令使任务在约定的时间执行已经计划好的工作,而Go由于语言的特性,不适合直接使用crontab来管理计划任务,cron (目前 Star8.3k)是一个用Go实现的定时任务库,支持秒级定时任务,可以满足绝大多数工作场景需求。
2. 安装1go get github.com/robfig/cron/v3@v3.0.0
3. 快速使用12345678910111213141516171819202122232425262728293031package mainimport ( "fmt" "github.com/robfig/cron/v3" "time")func main() { // 开启秒字段支持 c := cron.New(cron.WithSeconds()) // 传统表达式写法: 每秒执行一次 _, _ = c.AddFunc("0/1 * * * * *", func() { fmt.Println("传统表达式: ...
Go扩展包(二十六):colly
1.介绍Colly是Golang世界中最知名的Web爬虫框架,它提供简洁的 API,拥有强劲的性能、可以自动处理 cookie&session、提供灵活的扩展机制,同时支持分布式抓取和多种存储后端(如内存、Redis、MongoDB等)。
2.安装12// 下载最新版本go get -u github.com/gocolly/colly/v2
3. 快速入门3.1 语法模板1234567891011121314151617181920212223242526// 简单使用模板示例func collyUseTemplate() { // 创建采集器对象 collector := colly.NewCollector() // 发起请求之前调用 collector.OnRequest(func(request *colly.Request) { fmt.Println("发起请求之前调用...") }) // 请求期间发生错误,则调用 collector.OnError(func(response *colly.Response ...
Go扩展包(二十五):es
1.介绍Elasticsearch(ES)是一个基于Lucene构建的开源、分布式、RESTful接口的全文搜索引擎。Elasticsearch还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,ES能够横向扩展至数以百计的服务器存储以及处理PB级的数据。可以在极短的时间内存储、搜索和分析大量的数据。通常作为具有复杂搜索场景情况下的核心发动机。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎。
在Go语言中经常使用的包有以下两个,截止到(2021.07.10):
包
文档
Star 数量
说明
olivere/elastic
https://olivere.github.io/elastic/
6.1k
社区开源
elastic/go-elasticsearch
https://github.com/elastic/go-elasticsearch
3.5k
ES官方提供
2.安装这里使用olivere/elastic,@注意: 下载包的版本需要和ES版本相同,如我们这里使用的ES ...
Go扩展包(二十四):testing
1. 介绍testing 包为Go 语言提供自动化测试的支持。通过 go test 命令来执行单元测试文件,单元测试文件命名格式为: xxx_test.go,在单元测试文件中,根据测试类型不同可以分为:功能测试函数、基准测试函数,区别如下:
类型
函数格式
作用
功能测试函数
TestXXX(t *testing.T)
测试函数功能是否正常
基准测试函数
BenchmarkXXX(b *testing.B)
测试函数的性能
2. 功能测试2.1 编写规范1. 函数格式1234567891011// 导入测试包import "testing"// 功能测试函数名func TestName(t *testing.T) { t.Log("附加的日志信息") // 功能逻辑代码 if true { // 错误时调用t.Error t.Error("报告测试失败") }}
整理规则如下:
每个测试函数必须导入testing包
函数的名字必须以Test开头,可选的后缀名必 ...
Go扩展包(二十三):go-redis
1. 介绍redis官网推荐使用redigo(https://github.com/gomodule/redigo),截止到今天Github Start是8.2k 但go-redis(https://github.com/go-redis/redis)使用的人更多, 并且go-redis封装得更好。截止到今天Github Start 是12.1k。
2. 安装2.1 历史版本1go get -u github.com/go-redis/redis
2.2 最新版本1go get github.com/go-redis/redis/v8
@注意: 最新版本的客户端在操作redis时,相关函数需要传递上下文(context.Context),以下内容都是基于最新版本。
3. 连接Redis3.1 单机连接(NewClient)123456789101112131415// 单机连接redisfunc TestConnect(t *testing.T) { client := redis.NewClient(&redis.Options{ Addr: &qu ...
Go扩展包(二十二):jwt-go
1. 介绍JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下。
jwt-go 是使用Go语言实现的Json web token (JWT),目前GitHub Start 9.8k,源码地址: https://github.com/dgrijalva/jwt-go,从版本3.2.1开始,源码地址变更为: github.com/golang-jwt/jwt,需要下载最新版本时,可以使用这个地址。
2. 安装12// 下载最新版本go get -u github.com/golang-jwt/jwt
3.生成JWT1234567891011121314151617181920212223242526272829303132333435// 设置声明type UserClaims struct { *jwt.StandardClaims Name string Uid uint}// 创建Jwtfunc TestCreateJWTByNewWithCl ...
Go扩展包(二十一):excel
1. 介绍1. 1 什么是ExcelizeExcelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLSX / XLSM / XLTM / XLTX 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。使用本类库要求使用的 Go 语言为 1.15 或更高版本。
**源代码: https://github.com/qax-os/excelize **
文档:https://xuri.me/excelize/zh-hans/
1.2 为什么用Excelize在一些情况下我们需要通过程序操作 Excel 文档,例如:打开读取已有 Excel文档内容、创建新的 Excel 文档、基于已有文档(模版)生成新的 Excel 文档、向 Excel 文档中插入图片、图表和表格等元素 ...
Go扩展包(二十):math
1. 介绍Go标准包math,提供了基本的数学常数和数学函数。
2. 常量2.1 整数取值1234567891011121314const ( MaxInt8 = 1<<7 - 1 // int8最大值 MinInt8 = -1 << 7 // int8最小值 MaxInt16 = 1<<15 - 1 MinInt16 = -1 << 15 MaxInt32 = 1<<31 - 1 MinInt32 = -1 << 31 MaxInt64 = 1<<63 - 1 MinInt64 = -1 << 63 MaxUint8 = 1<<8 - 1 MaxUint16 = 1<<16 - 1 MaxUint32 = 1<<32 - 1 MaxUint64 = 1<<64 - 1)
2.2 浮点数取值123456const ( MaxFloat32 ...
Go扩展包(十九):gorm
1. 介绍gorm是一个使用Go语言编写的ORM框架。 它文档齐全,对开发者友好,支持主流数据库。官方中文文档 https://gorm.io/zh_CN/docs/index.html
2. 安装12go get -u gorm.io/gormgo get -u gorm.io/driver/sqlite
3. 连接MYSQLGORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server,这里只讲常见的MYSQL。其他类型数据库参见官方文档。
3.1 安装mysql依赖1go get -u gorm.io/driver/mysql
3.2 建立连接a. 默认连接1234567// 默认连接func ConnectMysqlByDefault(host, port, user, pass, dbname string) (*gorm.DB, error) { // user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True ...