thinkgo

module
v1.8.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 11, 2019 License: MIT

README

Thinkgo package

Public libraries and components for glang development.

I like the language of php. I have been using php development experience for 5 years.
It has inspired me a lot. I quickly converted to golang development in 2 years.
I am very glad to be exposed to this language.
These functions and packages are used extensively in development,
so they are packaged as components or libraries for development.

Package management

golang1.11以下版本,采用govendor机制引入第三包或直接使用vendor
golang1.11+版本,可采用go mod机制管理包,需设置goproxy

About package

.
├── bitset                              bitSet位图实现,将int数放到内存中进行curd操作
├── common                      公共函数库,包含每天流动日志,Time,Lock操作,uuid生成等
├── crypto                           md5,sha1,sha1File,cbc256,ecb,aes加解密函数等
├── gnsq                              go nsq消费队列封装,主要是pub/sub模式,其他类型也支持句柄调用
├── goredis                        基于go-redis/redis封装的redis客户端操作,支持redis cluster集群模式
├── gqueue                       通过指定goroutine个数,实现task queue执行器
├── gresty                           request请求封装,支持get,post,put,patch,delete等
├── gxorm                           基于xorm/mysql封装,支持读写分离连接对象设置
├── jsontime                     fix time.Time datetime格式的json encode/decode bug
├── logger                          基于uber zap框架封装而成的高性能logger日志库
├── monitor                      用于对go程序做prometheus/metrics性能监控,包含内存,cpu,请求数等
├── mysql                          gorm/mysql封装,主要基于gorm1.9.10+版本
├── mytest                        thinkgo单元测试用例
├── rediscache                redisgo操作库封装
├── redislock                    redis+lua脚步实现redis分布式锁TryLock,Unlock
├── runner                         runner按照顺序,执行任务操作,可作为cron作业或定时任务
├── sem                              采用空结构体struct{}和chan实现信号量互斥锁
├── work                            利用无缓冲chan创建goroutine池来控制一组task的执行
├── workpool                   workerPool工作池,实现百万级的并发,一般用于持续不断的大规模作业
├── xerrors                         error错误处理拓展包,支持错误堆栈信息
├── xsort                         基于标准包sort封装的一些sort操作方法
├── yamlconf                     yaml配置文件读取,支持int,int64,float64,string,struct等类型读取
├── commonstr_convert.go              字符串相关的函数,参考php函数实现
├── common/file.go                              文件/目录相关的函数,参考php函数实现
└── common/num.go                           数字相关的函数,参考php函数实现

usage

go version >= 1.13
设置goproxy代理
vim ~/.bashrc添加如下内容:
export GOPROXY=https://goproxy.io,direct
或者
export GOPROXY=https://goproxy.cn,direct

让bashrc生效
source ~/.bashrc

go version < 1.13
设置golang proxy
vim ~/.bashrc添加如下内容:
export GOPROXY=https://goproxy.io
或者使用 export GOPROXY=https://athens.azurefd.net
或者使用 export GOPROXY=https://mirrors.aliyun.com/goproxy/ #推荐该goproxy
让bashrc生效
source ~/.bashrc

go version < 1.11
如果是采用govendor管理包请按照如下方式进行:
    1. 下载thinkgo包
        cd $GOPATH/src
        git clone https://github.com/daheige/thinkgo.git
    2. 安装govendor go第三方包管理工具
        go get -u github.com/kardianos/govendor
    3. 切换到对应的目录进行 go install编译包

Test unit

测试mytest
$ go test -v
997: b75567dc6f88412d55576e4b09127d3f
998: c3923160f2304849734c0907083f7f65
999: 8b7a6dce56d346b567c65b3493285831
--- PASS: TestUuid (0.05s)
    uuid_test.go:13: 测试uuid
PASS
ok      github.com/daheige/thinkgo/mytest       15.841s

$ cd common
$ go test -v
2019/10/28 22:32:01 current rnd uuid a3e96dae-ca2a-d029-76c9-279b1fff1234
2019/10/28 22:32:01 current rnd uuid 4e136db3-56a8-fa67-93d7-f11f6cfd57ae
2019/10/28 22:32:01 current rnd uuid 30b83e42-2040-7ab3-9089-05d0d558bbcc
2019/10/28 22:32:01 current rnd uuid 16bc0ad1-4b17-27ee-2a2d-7b08f175295b
2019/10/28 22:32:01 current rnd uuid 979aefef-9db9-baad-920a-1742d24c2166
--- PASS: TestRndUuid (35.71s)
PASS
ok  	github.com/daheige/thinkgo/common	91.290s

License

MIT

Directories

Path Synopsis
chan实现trylock乐观锁 * 采用cas实现乐观锁及TryLock Compare And Swap 简称CAS,在sync/atomic包种 这类原子操作由名称以‘CompareAndSwap’为前缀的若干个函数代表。
chan实现trylock乐观锁 * 采用cas实现乐观锁及TryLock Compare And Swap 简称CAS,在sync/atomic包种 这类原子操作由名称以‘CompareAndSwap’为前缀的若干个函数代表。
* golang nsq消费队列封装,提供如下功能点 1、初始化生产者 2、初始化消费者 3、提供不同方式的消费者消费模式 4、当调用InitProducer,InitConsumer后可以直接调用nsq上底层方法 也可以使用本包提供的方法,其实也是调用nsq底层方法 5、关于优雅退出生产者和消费者,请看nsq_test.go 6、通过直接连接到nsqd进行消费,速度快,但不方便拓展,建议通过lookupd查找节点进行消费
* golang nsq消费队列封装,提供如下功能点 1、初始化生产者 2、初始化消费者 3、提供不同方式的消费者消费模式 4、当调用InitProducer,InitConsumer后可以直接调用nsq上底层方法 也可以使用本包提供的方法,其实也是调用nsq底层方法 5、关于优雅退出生产者和消费者,请看nsq_test.go 6、通过直接连接到nsqd进行消费,速度快,但不方便拓展,建议通过lookupd查找节点进行消费
package gqueue 通过指定goroutine个数,实现task queue执行器 提交任务到tash chan中,然后不断从chan中取出task执行 结合官方的sync.WaitGroup计数信号等待执行完毕 go goroutine非抢占式的,通过runtime.Gosched()让出cpu给其他goroutine
package gqueue 通过指定goroutine个数,实现task queue执行器 提交任务到tash chan中,然后不断从chan中取出task执行 结合官方的sync.WaitGroup计数信号等待执行完毕 go goroutine非抢占式的,通过runtime.Gosched()让出cpu给其他goroutine
package jsontime fix time.Time json encode/decode bug.
package jsontime fix time.Time json encode/decode bug.
* * gorm mysql封装,支持多个数据库实例化为连接池对象 * 结合了xorm思想,将每个数据库对象作为一个数据库引擎句柄 * xorm设计思想:在xorm里面,可以同时存在多个Orm引擎 * 一个Orm引擎称为Engine,一个Engine一般只对应一个数据库 * 因此,可以将gorm的每个数据库连接句柄,可以作为一个Engine来进行处理 * 容易踩坑的地方: 对于golang的官方sql引擎,sql.open并非立即连接db,用的时候才会真正的建立连接 但是gorm.Open在设置完db对象后,还发送了一个Ping操作,判断连接是否连接上去 对于短连接的话,建议用完就调用db.Close()方法释放db连接资源 对于长连接服务,一般建议在main/init中关闭连接就可以 具体可以看gorm/main.go源码85行
* * gorm mysql封装,支持多个数据库实例化为连接池对象 * 结合了xorm思想,将每个数据库对象作为一个数据库引擎句柄 * xorm设计思想:在xorm里面,可以同时存在多个Orm引擎 * 一个Orm引擎称为Engine,一个Engine一般只对应一个数据库 * 因此,可以将gorm的每个数据库连接句柄,可以作为一个Engine来进行处理 * 容易踩坑的地方: 对于golang的官方sql引擎,sql.open并非立即连接db,用的时候才会真正的建立连接 但是gorm.Open在设置完db对象后,还发送了一个Ping操作,判断连接是否连接上去 对于短连接的话,建议用完就调用db.Close()方法释放db连接资源 对于长连接服务,一般建议在main/init中关闭连接就可以 具体可以看gorm/main.go源码85行
*runner用于按照顺序,执行程序任务操作,可作为cron作业或定时任务 runner 包可用于展示如何使用通道来监视程序的执行时间,如果程序运行时间太长,也可以 用 runner 包来终止程序。
*runner用于按照顺序,执行程序任务操作,可作为cron作业或定时任务 runner 包可用于展示如何使用通道来监视程序的执行时间,如果程序运行时间太长,也可以 用 runner 包来终止程序。
利用无缓冲chan创建goroutine池来控制一组task的执行 1.
利用无缓冲chan创建goroutine池来控制一组task的执行 1.
package workpool 实现百万级的并发 go程序开发过程中,通过简单的调用go func 函数来开启协程,容易导致程序死锁 并且会无限制的开启groutine,groutine数量激增的情况下并发性能会明显下降 所以需要考虑使用工作池来控制协程数量,以达到高并发的效果.
package workpool 实现百万级的并发 go程序开发过程中,通过简单的调用go func 函数来开启协程,容易导致程序死锁 并且会无限制的开启groutine,groutine数量激增的情况下并发性能会明显下降 所以需要考虑使用工作池来控制协程数量,以达到高并发的效果.
* 自定义错误类型,一般用在api/微服务等业务逻辑中,处理错误 支持是否输出堆栈信息,可以把stack信息记录到日志文件中,方便定位问题
* 自定义错误类型,一般用在api/微服务等业务逻辑中,处理错误 支持是否输出堆栈信息,可以把stack信息记录到日志文件中,方便定位问题

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL