100个Go语言典型错误

100个Go语言典型错误

暂无评价综合评分的显示会考虑用户真实性等多项因素,每部作品出现综合评分的时间不定。
9.219 评价豆瓣读书

作品简介

《100个Go语言典型错误》介绍了开发者在使用Go语言时常犯的100个典型错误和低效用法,内容侧重于语言核心和标准库。对大多数错误的讨论都提供了具体的示例,以说明在什么时候容易犯这样的错误。这不是一本教条主文的图书,每个解决方案都详细传达了它适用的上下文。

《100个Go语言典型错误》适合熟悉Go编程和语法的开发人员阅读。

Teiva Harsanyi(泰瓦·哈尔萨尼)是Docker公司的资深软件工程师。他曾在多个领域工作,包括保险、交通运输及像空中交通管理这样的安全重点行业。他非常热衷于研究Go语言及如何设计和实现可靠的应用程序。

作品目录

  1. 版权声明
  2. 本书译者团队
  3. 推荐语
  4. 推荐序
  5. 前言
  6. 致谢
  7. 关于本书
  8. 关于作者
  9. 1 Go:入门易,精通难
  10. 1.1 Go语言概述
  11. 1.2 简单不意味着容易
  12. 1.3 100个Go语言错误
  13. 总结
  14. 2 代码和项目组织
  15. 2.1#1:意想不到的变量隐藏
  16. 2.2#2:不必要的嵌套代码
  17. 2.3#3:滥用init函数
  18. 2.4#4:过度使用getter和setter
  19. 2.5#5:避免接口污染
  20. 2.6#6:在生产者端的接口
  21. 2.7#7:返回接口
  22. 2.8#8:any意味着nothing
  23. 2.9#9:不知道什么时候使用泛型
  24. 2.10#10:没有意识到类型嵌入可能存在的问题
  25. 2.11#11:不使用函数式选项模式
  26. 2.12#12:项目组织混乱
  27. 2.13#13:创建实用程序包
  28. 2.14#14:忽略包名称冲突
  29. 2.15#15:缺少代码文档
  30. 2.16#16:不使用代码检查工具
  31. 总结
  32. 3 数据类型
  33. 3.1#17:使用八进制字面量会带来混淆
  34. 3.2#18:容易忽视的整数溢出
  35. 3.3#19:不了解浮点数
  36. 3.4#20:不了解切片的长度和容量
  37. 3.5#21:低效的切片初始化
  38. 3.6#22:对nil和空切片的困惑
  39. 3.7#23:未正确检查切片是否为空
  40. 3.8#24:无法正确复制切片
  41. 3.9#25:使用append的副作用
  42. 3.10#26:切片和内存泄漏
  43. 3.11#27:低效的map初始化
  44. 3.12#28:map和内存泄漏
  45. 3.13#29:比较值时发生的错误
  46. 总结
  47. 4 控制结构
  48. 4.1#30:忽视在range循环中元素被复制的事实
  49. 4.2#31:忽视range循环中参数是如何求值的
  50. 4.3#32:忽视在range循环中使用指针元素的影响
  51. 4.4#33:在map迭代过程中做出错误假设
  52. 4.5#34:忽视break语句是如何工作的
  53. 4.6#35:在循环中使用defer
  54. 总结
  55. 5 字符串
  56. 5.1#36:不理解rune的概念
  57. 5.2#37:字符串迭代不准确
  58. 5.3#38:乱用trim函数
  59. 5.4#39:缺乏优化的字符串连接
  60. 5.5#40:无用的字符串转换
  61. 5.6#41:子字符串和内存泄漏
  62. 总结
  63. 6 函数与方法
  64. 6.1#42:不知道使用什么类型的接收器
  65. 6.2#43:不要使用命名的结果参数
  66. 6.3#44:使用命名的结果参数的意外副作用
  67. 6.4#45:返回一个nil接收器
  68. 6.5#46:使用文件名作为函数输入
  69. 6.6#47:忽略defer语句参数和接收器的计算
  70. 总结
  71. 7 错误管理
  72. 7.1#48:panic
  73. 7.2#49:搞不清何时需要包装错误
  74. 7.3#50:不准确的错误类型检查
  75. 7.4#51:错误地检查错误值
  76. 7.5#52:处理同一个错误两次
  77. 7.6#53:忽略错误
  78. 7.7#54:忽略defer语句返回的错误
  79. 总结
  80. 8 并发:基础
  81. 8.1#55:混淆并发和并行
  82. 8.2#56:认为并发总是更快
  83. 8.3#57:对何时使用channel或互斥锁感到困惑
  84. 8.4#58:不理解竞争问题
  85. 8.5#59:不了解工作负载类型对并发的影响
  86. 8.6#60:误解Go上下文
  87. 总结
  88. 9 并发:实践
  89. 9.1#61:传播不恰当的上下文
  90. 9.2#62:在不知道何时停止的情况下启动goroutine
  91. 9.3#63:没有小心处理oroutine和循环变量
  92. 9.4#64:使用select和channel来期待确定性行为
  93. 9.5#65:没有使用通知channel
  94. 9.6#66:没有使用nil channel
  95. 9.7#67:对channel缓冲区大小感到困惑
  96. 9.8#68:忘记字符串格式化可能产生的副作用
  97. 9.9#69:使用append函数创造了数据竞争
  98. 9.10#70:对切片和map不准确地使用互斥锁
  99. 9.11#71:错误使用sync.WaitGroup
  100. 9.12#72:忘记了sync.Cond
  101. 9.13#73:没有使用errgroup
  102. 9.14#74:复制sync类型
  103. 总结
  104. 10 标准库
  105. 10.1#75:提供错误的持续时间
  106. 10.2#76:time.After和内存泄漏
  107. 10.3#77:常见的JSON处理错误
  108. 10.4#78:常见的SQL错误
  109. 10.5#79:没有关闭瞬时资源
  110. 10.6#80:在响应HTTP请求后忘记加return语句
  111. 10.7#81:使用默认的HTTP客户端和服务端
  112. 总结
  113. 11 测试
  114. 11.1#82:未区分测试种类
  115. 11.2#83:未打开-race开关
  116. 11.3#84:未使用测试执行模式
  117. 11.4#85:未使用表格驱动型测试
  118. 11.5#86:在单元测试中休眠
  119. 11.6#87:没有有效处理time API
  120. 11.7#88:未使用测试工具包
  121. 11.8#89:写出不准确的基准测试
  122. 11.9#90:未探索所有的Go测试特性
  123. 总结
  124. 12 优化
  125. 12.1#91:不了解CPU缓存
  126. 12.2#92:编写导致伪共享的并发代码
  127. 12.3#93:不考虑指令级并行性
  128. 12.4#94:不了解数据对齐
  129. 12.5#95:不了解栈与堆
  130. 12.6#96:不了解如何减少分配
  131. 12.7#97:没有依赖内联
  132. 12.8#98:没有使用Go诊断工具
  133. 12.9#99:不了解GC的工作原理
  134. 12.10#100:不了解在Docker和Kubernetes中运行Go程序的影响
  135. 总结
  136. 结语
载入中