附录A:Go语言常见的坑
- 可变参数是空接口类型时,需要注意参数展开的问题
- 数组是值传递,所以函数内的修改无法体现。
- map遍历时返回顺序不固定,不能依赖map的返回顺序。
- 局部作用域中,返回值会被同名的局部变量屏蔽。
- recover必须在defer函数中进行,并且捕获的只能是祖父级函数的异常。
- main函数提前退出时,后台goroutine无法保证完成任务。
- 不能通过sleep来回避并发中的问题
- 独占CPU会导致其他goroutine饿死,需要用runtime.Gosched()来让渡CPU。
- 不同goroutine之间不满足顺序一致性内存模型
- 闭包错误引用同一个变量
- 在循环内部执行defer语句,会导致资源延迟释放
- 切片会导致整个底层数组被锁定,底层数组较大时,会对内存产生很大压力。
- 空指针和空接口不等价。
- 内存地址会变化。
- Goroutine泄露,可以用context包来避免。