golang中的一些坑 (长更中)

语法

for-range

golang中不能在for-range中将迭代器赋值。

内存泄漏

Slice

slice的截取是会造成短暂性内存泄漏的,比如a := b[:1],两者会引用相同的底层数组,只有当a或者b扩容时,才会引发底层数组的重新分配,a和b才会引用不同的内存块。因此需要中间值进行替代:

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

posted @ 2022-01-05 01:34  moon_orange  阅读(86)  评论(0编辑  收藏  举报