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语言的表现力确实很令人兴奋。