chan其实是一个队列,而且是一个带有锁等待功能的队列,因此用它可以做很多任务队列相关的工作,比如说连接池。最近打算用go来写一个小的软件配置管理系统,使用中发现没有连接池,于是就是chan写了一个简单的,使用了一下发现相当好用。
var MysqLPool chan *MysqL.MysqL func getMysqL() *MysqL.MysqL { if MysqLPool == nil { MysqLPool = make(chan *MysqL.MysqL,MAX_POOL_SIZE) } if len(MysqLPool) == 0 { go func() { for i := 0; i < MAX_POOL_SIZE/2; i++ { MysqL := MysqL.New() err := MysqL.Connect("127.0.0.1","root","","wgt",3306) if err != nil { panic(err.String()) } putMysqL(MysqL) } }() } return <-MysqLPool } func putMysqL(conn *MysqL.MysqL) { if MysqLPool == nil { MysqLPool = make(chan *MysqL.MysqL,MAX_POOL_SIZE) } if len(MysqLPool) == MAX_POOL_SIZE { conn.Close() return } MysqLPool <- conn }
短短几十行代码就可以实现一个较为完美的连接池功能,go语言的表现力确实很令人兴奋。