GO语言学习心得day03| 青训营笔记

78 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第三天。今天学习了高质量编程和性能调优,了解了go语言的编码规范,从今天开始接触到了go语言比较底层的东西。

高质量编程

 高质量编程意味着代码的完成度要高,处理好每种边界情况,没有bug的同时要简洁易懂,为了达到此目的,我们的代码至少要具备这三种原则,简单性,业务的实现逻辑要尽量简单,不要用复杂的逻辑去解决简单问题,可读性,代码是写给人看的,不可以为了炫技把代码写的难以理解,生产力,一个项目往往不是单独开发的,而是团队合作完成的。

编码规范

 很多IDE中都集成了格式化工具,他会在文件编译后自动格式化代码,例如对其,删除不必要的括号等,go语言用这种强制性的方法来让学习者习惯go语言的代码格式。

注释

 在之前学习和使用java语言的时候没有养成写注释的好习惯,导致我在看很久之前做的项目代码时看不懂当时解决问题的思路,所以我要在学go语言的同时养成写注释的习惯。与java中的注释类似,单行注释使用双斜杠//多行注释使用/* */。
 方法签名上要有注释,来解释方法的作用,参数是什么,返回值是什么,什么时候会报错。方法内部的实现规则也要有注释,实现主要逻辑的代码要解释其上下文。公共符号始终都要有注释,要解释每个变量、结构或者常量代表的含义。

命名规范

 任何结构的命名都要见名知义,在此基础上要尽量简短。缩略词要全大写,位于开头且不需要导出时要全小写,例如使用ServeHTTP而不是ServerHttp。在方法命名时不应该携带包名的上下文信息。包的命名不能包含大写字母和下划线,只能由小写字母组成,不能与标准库重名,也尽量避开采用变量名。

流程控制

 在使用条件控制语句时应尽量避免出现不必要的else,在多个分支中都包含return时要删除不必要的else,同时要保证代码路径为最小缩进,如果嵌套的两层if有先后关系尽量拆分成两个if使代码更具可读性。

错误及异常处理

 go语言中的error提供了error嵌套另一个error形成错误链的功能,我们可以在fmt.Errorf()中将一个错误添加至错误链中。errors.Is()方法可以判断一个错误是否存在于错误链中,==只能判断给定的error是否是特定的error,也可以使用errors.As()方法返回给定的error。在go语言中比错误更严重的是panic,panic的出现代表着程序无法正常工作,这个错误会一直向栈顶传递,最终导致程序的终止,当程序在启动阶段出现不可逆的错误时可以在main方法或者init方法中使用panic来阻止程序启动打印日志。recover方法可以在发生panic后仍可以让程序正常执行并捕获错误信息,recover必须通过defer来运行。

性能优化

 性能优化的前提是满足代码的准确和简洁,我们可以使用benchma工具来监测程序运行的消耗:

image.png

切片、map优化

 切片在项目中大量使用,所以对切片的优化显得尤为重要,我们在使用make()方法时可以预估其容量,尽量在声明时确定下容量大小减少扩容次数。切片的截取并不会另外申请空间,而是复用之前的切片,这样会导致原切片的内存不能被及时释放,应尽量使用copy替代re-slice,copy()方法会重新申请一块内存并将原切片的数据一次拷贝到新切片中。

字符串优化

 尽量使用strins.Builder进行字符串的拼接,类似于Java中的字符串拼接,如果只是单纯的两个字符串进行拼接,由于字符串属于不可变的类型,每次拼接都会分配更大的内存,所以不建议使用,strins.Builder或者strins.Builder底层都维护了一个字节数组,每次追加都只是给数组添加数据,不会重新去申请用来存结果的内存

空结构体及atomic

 空结构体不占据空间,可以用来做占位符,节省资源。在使用锁来维护并发安全时,可以分情况使用atomic来代替加锁操作,由于atomic是通过硬件实现的具有更高的性能,当我们保护的不是一段逻辑而是仅仅一个变量的值时可以考虑使用atomic来替换锁来提高效率。