for-range
golang中不能在for-range中将迭代器赋值。
内存泄漏Slice
a := b[:1]
var a []int
c := append(c, b[:1])
如果切片元素是指针类型,需要及时将被删除的指针置为nil。
a := appen(b[1:2], b[3:4])
b[2] = nil
Timer
使用timer经常会遇到资源回收不及时导致的各种问题。假设实现一个定时器功能,使用timer的大致模版如下:
func demo() {
timer := time.NewTimer(1 * time.Second)
defer func() {
if !timer.Stop() {
<-timer.C
}
}()
Over:
for {
select {
case <-exitChan:
break Over
case <-timer.C:
timer.Reset(db.config.MergeInterval)
// do something...
}
}
}
1、关闭timer的方式是timer.Stop(),关于为什么多加判断,可以看下方餐考博客或者Stop源码注释。大意是,timer结束只是将chan从堆上移除,而chan不会释放,为保证chan空,需要再做一次取出。
2、定时器的循环,通过exitChan来退出。外部函数调用不可遗漏exitChan。
参考:https://studygolang.com/articles/9289