《高质量编程与性能调优实战》课程笔记 | 青训营笔记

110 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记

1.如何编写高质量的go代码

  • gofmt                                             
      Go语言官方提供的工具,gofmt能自动化Go语言代码为官方统一风格。                 
    
  • goimports
      相当于gofmt加上依赖包管理,能够自动增加或删除依赖的包引用。
    
  • 编写注释
      注释应该解释代码的作用,并且解释代码是如何做的,还应该解释代码实现的原因。
      合理的代码注释能够缩短阅读代码的时间,也更易于维护代码。
    
  • 编码规范
      代码的逻辑要尽量走直线,要尽量避免复杂的嵌套
      逻辑简单清晰的代码,可读性会很高,可维护性也将提高
    
  • 错误处理
      应当优先使用errors.New 来直接表示简单错误
      如果想要判定一个错误是否为特定错误,可以使用errors.IS
    
  •  panic
       不建议在业务代码中使用panic,如果panic了,它会导致整个程序崩溃
       可用error替代panic
    
  1. 性能优化
  •  make: slice
       尽可能在make时提供具体的容量信息,避免造成多次内存分配,可获得更好的性能。
    
  •  makemap
       尽可能提前分配好空间,可减少拷贝的rehash的性能损耗
    
  •  字符串拼接:
         在字符串拼接时,避免使用string + string 的方法
         应使用strings.Builder来进行字符串拼接,两种方法的实际性能有很大差异。
         因为在Go语言中字符串是不可变的,内存占用是固定的,
         如果使用+string的方法会造成重新分配内存,造成性能损耗。
         而strings.Builder bytes.Buffer底层是byte数组,不需要每次都重新分配内存
    
  •  atomic:
       锁和atomic的对比: 锁的实现是通过操作系统来实现,
       属于系统调用 atomic操作是通过硬件实现,效率比锁高 
       sync.mutex 应该用来保护一段逻辑 不仅仅用于保护一个变量
    
  1. 性能分析工具pprof
  •     pprof:
          是分析性能分析数据的可视化工具,可知道代码在什么地方耗费了多少CPU、内存
          可通过web网页的方式查看各部分组件的采样数据
          alloc 表示内存分配情况
          goroutine 表示当前所有goroutine的堆栈信息
          block 表示阻塞操作情况
          mutex 表示锁竞争情况
          trace 是程序运行的跟踪信息
    

image.png