高质量编程后感

69 阅读4分钟

Go高质量编程与性能优化笔记

今天分享一下我在Go编程质量和性能优化方面的心得。说实话,从Java转到Go的过程中,我对"高质量代码"的理解发生了很大变化。

1. 编码规范的思考

最开始写Go的时候,我还在用Java的编码习惯,比如:

  • 喜欢写很长的类名(UserServiceImplementation)
  • 习惯性地把所有东西都封装起来
  • 倾向于写很多的接口

但慢慢地,我发现Go的哲学完全不一样。Go推崇简单直接,这让我重新思考了什么是"好的代码"。

1.1 命名规范的领悟

说实话,Go的命名规范一开始让我很不习惯:

  • 为什么要用ID而不是Id?
  • 为什么包名要这么短?
  • 为什么接口名要用er结尾?

后来我明白了:命名不是为了显示你的英语有多好,而是为了让代码更容易理解。比如:

  • net/http 比 networkHttpPackage 好读多了
  • Reader 比 ReadInterface 更简洁
  • ID 比 Id 更容易识别

1.2 注释的新认识

以前写Java的时候,我喜欢写很长的JavaDoc注释。但Go让我学会了:

  • 好的代码本身就是最好的文档
  • 注释要说明为什么,而不是是什么
  • 导出的符号确实需要注释,但要简洁明了

2. 代码质量的深度思考

2.1 可维护性的顿悟

记得有一次,我写了一个300行的函数,同事看了直摇头。这让我深刻理解了:

  • 函数不是越长越好
  • 嵌套不是越深越厉害
  • 参数不是越多越强大

现在我的原则是:

  • 一个函数最好在眼睛一屏能看完
  • 超过3层嵌套就考虑拆分
  • 参数太多就封装成结构体

2.2 错误处理的转变

说实话,最开始我很讨厌Go的错误处理方式:

  • 为什么不用try-catch?
  • 为什么要到处if err != nil?
  • 为什么返回值要放在最后?

但现在我觉得Go的方式更好:

  • 错误处理清晰可见
  • 强制你思考每个错误
  • 代码流程更容易理解

2.3 并发安全的领悟

Go的并发太容易了,但也容易出问题。我犯过的错:

  • 忘记关闭channel
  • 忽略goroutine泄漏
  • 滥用共享内存

现在我学会了:

  • 优先用channel通信
  • 小心使用共享内存
  • context很重要

3. 性能优化的心得

3.1 内存管理的顿悟

最开始我总是过度担心内存:

  • 到处用指针
  • 疯狂复用对象
  • 提前分配一切

后来我明白了:

  • 过早优化是万恶之源
  • 要先做性能分析
  • 小对象用值传递挺好

3.2 CPU优化的经验

有次我试图优化一个API的性能:

  • 首先想到加缓存
  • 然后想到用goroutine
  • 最后想到调整算法

结果发现:

  • 算法优化效果最好
  • 并发不是万能药
  • 缓存要看场景

4. 实战中的深刻教训

4.1 切片操作的坑

我在切片上栽过很多跟头:

  • append导致的内存问题
  • 子切片引用导致的内存泄漏
  • 容量预估不准确

现在我会:

  • 提前预估容量
  • 注意切片共享
  • 适时使用copy

4.2 字符串处理的教训

最惨的一次是在循环中拼接字符串:

  • 性能直线下降
  • 内存疯狂增长
  • GC压力很大

学到了:

  • 用strings.Builder
  • 预估容量很重要
  • 字符串是不可变的

5. 给新手的建议

  1. 关于学习:
  • 多读标准库源码
  • 理解Go的设计哲学
  • 不要带着其他语言的思维
  1. 关于优化:
  • 先写正确的代码
  • 再写清晰的代码
  • 最后才是快的代码
  1. 关于工具:
  • 学会用pprof
  • 学会看性能指标
  • 学会做基准测试

6. 个人感悟

说实话,Go改变了我对编程的很多认识:

  • 简单比复杂好
  • 明确比隐晦好
  • 实用比完美好

最重要的是:不要过度设计,不要过早优化,写对写好最重要!

如果你也在学习Go,希望我的经验能帮到你。有问题随时讨论!