Go学习03 | 青训营笔记

43 阅读3分钟

**这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

Go 高质量编程,编码规范以及性能优化

~4YY5Q)E)TNIEQ{6K5$FXSV.png

什么是高质量编程?编写的代码能够达到正确可靠,简洁清晰的目标可称之为高质量代码。(比如各种边界条件是否考虑完备;异常处理情况,稳定性的保证,是否易读易维护)

![RXX9S%CWG00C4L{CPC56AD.png

编码规范中:注释尤为重要。 那注释应该怎么做哪些? 注释应该解释代码的作用;应该解释代码如何做的;应该解释代码实现的原因并且解释代码什么情况会出错。 注释尤为重要,不可因为自己的懒惰或者其他原因不写注释这样会造成其他人员阅读代码极大的困难。

命名规范注意几点:一,要简洁。

缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写。

- 例如使用ServeHTTP而不是ServeHTTP

- 使用XMLHTTPRequest或者xmlHTTPRequest

三,变量距离其被使用的地方越远,则需要携带越多的上下文信息

  • 全局变量在其名字中需要更多的上下文信息,使得在不同地方可以轻易辨认出其含义。

错误和异常处理

  • 对于简单错误(仅出现一次,在其他地方不需要捕获),优先使用 errors.New 创建匿名变量直接表示;如有格式化需求,使用 fmt.Errorf;
  • fmt.Errorf 中使用 %w 将一个错误关联至错误链中;
  • 使用 errors.Is 判定一个错误为特性错误,比起直接使用 == 的好处是可以判断错误链上的所有错误是否含有特定错误;
  • 使用 errors.As 获取错误链上特定种类的错误;
  • 只有在程序启动阶段发生不可逆转的错误时才使用 panic,并且 Go 可以使用 revover 语句来从 panic 中恢复;
  • 关于revover想详细了解可在网上搜索相应博客

性能优化

  • 使用 Benchmark 进行基准测试;

  • 尽可能为 slice 和 map 预分配内存,这样性能会提示不少比起没分配(因为预分配只有一次内存分配);

  • 切片的本质是一个数组片段的描述(数组指针,片段长度,片段的容量也就是不改变内存分配情况下的最大长度),切片操作并不复制切片指向的元素而是创建一个新的切片复用原来的切片底层数组,以切片的appdend为例,它有两种应用场景:一是当append 之后的长度小于等于cap,将会直接利用原底层数组剩余的空间。而是当append后的长度大于cap时,则会分配一块更大的区域来容纳新的底层数组。 因此,为了避免内存发生拷贝,如果能够知道最终的切片的大小,预先设置cap的值能够避免额外的内存分配,获得更好的性能。所以为切片创建切片不会创建新的底层数组,这可能会导致内存泄漏发生,此时可用 copy 代替 re-slice(可释放过大的原切片占据的大量内存空间);

  • 多个字符串拼接时,使用 strings.Builder 比直接使用 + 或使用 bytes.Buffer 更快(因为字符串在GO中是不可变类型,占用的内存大小是固定的,使用+每次都会重新分配内存;而另外两个底层都是[]byte数组,采用了内存扩容策略。不需要每次拼接重新分配内存)。想了解内存扩容策略的可以上网详细了解下。

  • 当需要占位符时,可使用空结构体(struct{})代替,其不会占据镇和内存空间;

  • 使用 atomic 包代替锁修改变量;