本文介绍在阅读Go语言高级编程一书,看到书中总结Go语言常遇到的问题和解决方法与大家分享一下。
- 可变参数是空接口类型
- 数组是值传递
- map遍历时顺序不固定
- 返回值被屏蔽
- recover必须在defer函数中运行
- main()函数提前退出
- 通过Sleep()来回避并发中的问题
- 独占CPU导致其他Goroutine饿死
- 不同Goroutine之间不满足顺序一致性内存模型
- 闭包错误引用同一个变量
- 在循环内部执行defer语句
- 切片会导致整个底层数组被锁定
- 空指针和空接口不等价
- 内存地址会变化
- Goroutine 泄露
这里列举的使用Go语言常遇到的问题都是符合Go语言语法的,可以正常编译,但是可能出现运行结果错误,或者是有资源泄漏的风险。
Go语言常遇到的问题和解决方法总结
1、 可变参数是空接口类型
当参数的可变参数是空接口类型时,传入空接口的切片时需要注意参数展开的问题:
![ef19c44af43827815a1cd9137a3e22c0.png](https://i-blog.csdnimg.cn/blog_migrate/254373ab4d4d8242ba053f2b23ac2f20.jpeg)
可变参数是空接口类型
不管是否展开,编译器都无法发现错误,但是输出是不同的。
2、数组是值传递
在函数调用参数中,数组是值传递,无法通过修改数组类型的参数返回结果:
![7fbe13a5c90dfcf12fcada2fe5d6f41d.png](https://i-blog.csdnimg.cn/blog_migrate/c46120b4536619b5f2afd9efb8a8d216.jpeg)
数组是值传递
必要时需要使用切片。
![d61cd83bc0c2f0af19855ba7f890cdc6.png](https://i-blog.csdnimg.cn/blog_migrate/b05b33da98449e0c7bf9587cb4edef2e.jpeg)
3、map遍历时顺序不固定
map是一种散列表实现,每次遍历的顺序都可能不一样:
![c6f6dda9e7e003de1b9a23e3009e9e98.png](https://i-blog.csdnimg.cn/blog_migrate/13987a22e1cff89a2b45ba126e55c819.jpeg)
第一执行map的结果
![5851d243a14488553512c50337fbb586.png](https://i-blog.csdnimg.cn/blog_migrate/635b1036a6686916a95aacda3ef2f077.jpeg)
第二执行map的结果
为什么