对象池
===
### 使用buffered channel实现对象池
![](https://box.kancloud.cn/03ed2deefeec0398e034e4d7b97d2e8f_895x179.png)
~~~
type TargetObj struct {
}
type ObjPoll struct {
poll chan *TargetObj
}
func NewObjPoll(num int) *ObjPoll {
poll := &ObjPoll{
poll: make(chan *TargetObj, num),
}
for i := 0; i < num; i++ {
poll.poll <- &TargetObj{}
}
return poll
}
func (o *ObjPoll) Get(timeout time.Duration) (*TargetObj, error) {
select {
case data := <-o.poll:
return data, nil
case <-time.After(timeout):
return nil, errors.New("time out")
}
}
func (o *ObjPoll) Pul(obj *TargetObj) error {
select {
case o.poll <- obj:
return nil
default:
return errors.New("overflow")
}
}
~~~
- Hello World
- UDP
- UDP服务端
- UDP客户端
- UDP广播
- 错误处理
- 编写好的异常处理
- panic和recover
- 并发编程
- Hello Goruntine
- 共享内存并发机制
- RWMutex
- CSP并发机制
- 多路复用和超时控制
- 通道关闭与广播
- Context与任务的取消
- 只运行一次
- 按需任意任务完成
- 所有任务完成
- 补充:range channel注意实现
- 对象池
- sync.Pool临时对象池
- 单元测试
- 表格测试法
- Banchmark
- BDD
- 反射
- 利用反射编写灵活的代码
- Struct Tag
- 万能程序
- 常用架构模式
- Pipe-filter pattern
- Micro Kernel
- 性能分析
- 高性能代码
- sync.MAP分析
- Concurrent Map
- GC友好的代码
- Uber开发风格规范