使用Golang下chan实现一个缓冲池(Pool)
来源:互联网 发布:unity ugui 源码下载 编辑:程序博客网 时间:2024/06/16 16:37
使用Golang实现byte的缓冲池
在本文中,使用golang语言中特殊的chan结构来实现一个[]byte类型的缓存池。
BytesPool中主要有两个方法:
1. Put([]byte):将byte切片放入到缓存池中
2. Get(sz int) []byte:从缓存池中去一个长度为sz的切片;如果缓存池中切片的容量(cap)不大于sz,则返回容量大小为sz的空的byte切片
注: 缓存池中的切片都遵循先进先出的原则。
// BytesPool is a pool of byte slice that can ben usedtype BytesPool struct {pool chan []byte}func NewBytesPool(max int) *BytesPool {return &BytesPool{pool: make(chan []byte, max),}}// Get returns a byte slice with at least sz capacity.func (p *BytesPool) Get(sz int) []byte {var c []byteselect {case c = <-p.pool:default:return make([]byte, sz)}if cap(c) < sz {return make([]byte, sz)}return c[:sz]}// Put returns a slice back to the poolfunc (p *BytesPool) Put(c []byte) {select {case p.pool <- c:default:}}
缓存池的使用如下面代码所示:
func main() {pool := NewBytesPool(3) // set the pool length is 3buf := []struct {b []byte}{{b: []byte("abcdef")},{b: []byte("123455")},{b: []byte("aaaabbbcccddd")},}for _, b := range buf {pool.Put(b.b)}for i := 0; i < len(buf); i++ {fmt.Println(string(pool.Get(len(buf[i].b))))}}
下面使用chan实现一个包含(key, values)的缓冲池
type Entry struct {key int64values []byte}func NewEntry(key int64, values []byte) Entry {return Entry{key: key,values: values,}}type LimitedEntry struct {pool chan Entry}func NewLimitedEntry(capacity int) *LimitedEntry {return &LimitedEntry{pool: make(chan Entry, capacity),}}func (p *LimitedEntry) Get() (Entry, bool) {var e Entryselect {case e = <-p.pool:return e, truedefault:}return e, false}func (p *LimitedEntry) Put(e Entry) {select {case p.pool <- e:default:}}该缓存池的测试如下:
func main() {entries := []Entry{NewEntry(123, []byte("abc")),NewEntry(456, []byte("jidd")),NewEntry(678, []byte("anhdu")),}for _, e := range entries {pools.Put(e)}for i := 0; i < 5; i++ {if e, ok := pools.Get(); ok {fmt.Printf("key: %v, value: %v\n", e.key, string(e.values))} else {fmt.Println("the pools is empty")}}}运行结果如下所示,当缓存池为空时,打印“the pools is empty”:
key: 123, value: abckey: 456, value: jiddkey: 678, value: anhduthe pools is emptythe pools is empty
阅读全文
0 0
- 使用Golang下chan实现一个缓冲池(Pool)
- golang chan 使用的一个坑
- golang使用chan
- golang chan 使用例子
- 利用golang中的chan数据类型来实现简易连接池
- C++实现golang chan 版本一
- 【golang】signal和chan结合使用
- Golang -- 使用 Bufferd channel 实现 线程安全的 pool
- 无缓冲chan
- golang 并发 chan
- Golang之chan/goroutine
- 关于GOLANG的chan
- golang chan的运用
- 使用common-pool实现的一个简单的线程池
- 使用common-pool实现的一个简单的线程池
- 如何用golang写一个thread pool
- Golang 关于通道 Chan 详解
- golang实现无缓冲输入(getch)
- Openwrt下安装Lighttpd+PHP+Mysql总结(一)
- jenkins学习
- 让PowerShell方便的查看项目git仓库的状态
- MyBatis在Oracle数据库下用concat函数模糊查询之参数个数无效错误
- 51nod 1574 || Codeforces 584 E. Anton and Ira 思维+构造+贪心
- 使用Golang下chan实现一个缓冲池(Pool)
- RAML for JAX-RS的raml-to-jaxrs子项目简介
- OSI七层与TCP/IP五层网络架构详解
- SaaS,软件即服务
- @RequestMapping 用法详解之地址映射
- 机器学习:诊断偏差和方差
- [POJ3122]Pie
- Gitlab在Ubuntu、Debian、CentOS 6、CentOS 7、OpenSUSE、Raspberry Pi2安装
- if语句的猜拳游戏