Golang初学者常见错误:50个陷阱解析
需积分: 10 59 浏览量
更新于2024-07-09
收藏 854KB PDF 举报
"这份PDF资料主要面向Go语言(Golang)的新手,旨在帮助初学者避免在学习过程中可能遇到的一些常见问题和陷阱。内容涵盖了初级和中级两个阶段,包括语法细节、并发编程、数据结构操作等多个方面。"
1. 左大括号`{`放置规则:Go语言规定,代码块的左大括号必须与控制语句在同一行,否则会导致编译错误。
2. 未使用的变量:未使用的变量会被编译器警告,为了保持代码的清晰和有效,应当删除或使用它们。
3. 未使用的import:导入但未使用的包也会引发警告,应删除或使用导入的包。
4. 简短声明的限制:简短声明(`:=`)只能在函数内部使用,用于快速声明并初始化变量。
5. 重复声明变量:简短声明可以重复声明变量,但需要确保在同一个作用域内,且有初始值。
6. 设置字段值:不能使用简短声明来为结构体字段赋值,需使用传统声明方式。
7. 变量覆盖:避免意外覆盖变量,特别是全局变量,可能导致难以追踪的错误。
8. 显式类型变量与nil:显式类型声明的变量不能用nil初始化,除非该类型是可以为nil的,如指针、接口等。
9. nil值的使用:直接使用值为nil的slice、map可能导致运行时错误,应先检查其非空性。
10. map容量:创建map时可以指定初始容量,有助于优化性能。
11. string的nil值:string类型的变量值不能为nil,其值总是由字节序列构成。
12. Array作为参数:传递数组到函数时会复制整个数组,可能导致性能问题,通常使用slice代替。
13. range遍历:在range遍历slice和array时要注意返回的索引和值,避免混淆使用。
14. 数据结构理解:slice和array本质上是一维的,但slice更灵活,支持动态扩展。
15. 访问不存在的map键:尝试访问不存在的map键会返回零值,而不是抛出异常。
16. string不可变:Go中的字符串是不可变的,一旦创建,就不能修改。
17. 字符串与byteslice转换:需要理解如何在字符串和byteslice之间转换,以进行字符处理。
18. string与索引:字符串可以通过索引访问字节,但不能直接修改。
19. 非UTF8字符串:字符串不一定都是UTF8编码,处理时需注意编码问题。
20. 字符串长度:使用`len()`获取字符串的字节长度,若需获取字符数,需考虑UTF8编码。
21. 多行声明:在多行声明中,最后一行后需要逗号,避免在代码编辑和格式化时引入错误。
22. log.Fatal和log.Panic:这两个函数不仅仅是记录日志,还会导致程序退出。
23. 内建数据结构同步:Go的内建数据结构如map不是线程安全的,需要在多线程环境中自行处理同步。
24. range迭代string:range迭代string时,会依次返回每个字节。
25. range迭代map:range迭代map时,会返回键值对,但顺序是不确定的。
26. switch fallthrough:fallthrough语句允许case间的连续执行,需谨慎使用。
27. 自增和自减运算:了解它们的运算规则,特别是与其他运算符结合使用时。
28. 按位取反:使用`^`运算符进行按位取反,可改变二进制表示。
29. 运算符优先级:理解不同运算符的优先级,避免表达式解析错误。
30. json解码:在解码json时,未导出的struct字段不会被编码或解码。
31. goroutine管理:程序退出时确保所有goroutine已经完成,否则可能导致资源泄露。
32. channel通信:无缓冲channel在receiver准备就绪时立即完成发送,反之则阻塞。
33. 关闭channel:向已关闭的channel发送数据会触发panic,关闭channel前确保无接收者。
34. 使用nil channel:使用值为nil的channel会导致阻塞,必须初始化后再使用。
中级篇涉及到更多进阶主题:
35. HTTP响应体关闭:调用`Response.Body.Close()`以释放HTTP响应体占用的资源。
36. HTTP连接关闭:管理HTTP连接以优化性能和资源使用。
37. JSON数字解码:将JSON数字解码为`interface{}`时,需要根据实际需求类型转换。
38. 数据结构比较:理解不同数据结构(如struct、array、slice和map)的比较规则。
39. recover机制:在 panic 后使用 recover() 函数可以捕获并处理异常。
40. range迭代更新:在range迭代中通过更新引用更新元素,需注意副本和原始数据的关系。
41. slice底层数据:理解slice的内部结构,包括底层数组和指向它的指针。
42. slice误用:误用slice可能导致意外的共享和修改,需注意拷贝和深拷贝的区别。
43. 旧slice:更新slice可能导致原数据的意外修改,使用副本避免这种问题。
44. 类型声明与方法:了解如何为类型声明方法,以及方法接收者的使用。
45. 代码块跳出:掌握如何在for-switch和for-select中跳出多个代码块。
46. for循环中的迭代变量与闭包:理解for循环变量在闭包中的行为,防止意外的副作用。
47. defer参数值:defer函数的参数在调用时就被求值,即使函数晚些时候执行。
48. defer执行时机:defer函数在所在函数返回前执行,理解这一特性对于清理工作至关重要。
49. 类型断言失败:类型断言失败会导致panic,使用if或switch判断类型更安全。
50. 阻塞的goroutine:确保goroutine的正确同步和通信,避免长时间阻塞。
这些知识点覆盖了Go语言的基础语法、数据结构、并发编程等多个方面,是新手学习Go语言时的重要参考资料。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2021-09-20 上传
2022-10-29 上传
2022-10-28 上传
2019-09-28 上传
2024-02-18 上传
2023-02-28 上传
永不加班的大奔
- 粉丝: 12
- 资源: 5
最新资源
- Sensors:该存储库包含不同传感器的简单程序
- Excel表格+Word文档各类各行业模板-迷你小台历.zip
- ser316-spring2021-B-lclindbe:作业2-单元测试
- iec61131-gaskessel:燃气锅炉的模拟调试
- 这是我学习mysql 以及 Oracle 数据库操作过程中的代码.zip
- 内存提升
- 御剑后台扫描珍藏版.zip
- node-express-mongoose-practice
- 这是一步步学习MySQL的源代码,最后的项目是一个超市管理系统的集合.zip
- kicad-custom-library:我在设计时遇到的一些组件的库
- actions-hooks-mattermost:一个简单的Webhook,用于在Mattermost通道中记录来自GitHub的部署事件
- Disco-2.12.2.zip
- composition-debugger:在合成中设置断点
- 形式验证
- 这是一个前后端分离的小实验项目,代码总量在120行左右,前端文件是在别处下载下来的,适合学完go语言基础后进一步学习.zip
- leetcode:leetcode 在线裁判