前言
老生常谈,还是从三个方面讲
- Go应用
- 项目管理
- 项目文档
Go应用
代码结构
目录结构
Go 项目目录结构设计
模块拆分
- 按层拆分,如经典的MVC三层结构,缺点是容易循环引用
- 按功能拆分,功能单一,出现循环引用的概率小。按功能拆分,后期拆微服务更方便些。
代码规范
编码规范
Uber Go 规范
开发者很难靠自觉遵循规范,所以,我们在CI上触发代码规范检查,符合规范的才能通过合并到主分支上去,不合格就打回去,你不改的符合规范,就让你提交不上去,我看谁还偷懒
最佳实践
用Go最早的一批人总结的符合Go语言特色的经验和共识
https://go.dev/doc/effective_go
https://github.com/golang/go/wiki/CodeReviewComments
https://rakyll.org/style-packages/
代码质量
代码质量主要元测试去保证,要达到一定指标的覆盖率。有些经常改动的模块,甚至要求覆盖率达到100%(根据业务去决定), 可以借助gotests 工具生成测试代码,来减轻工作量
- 由于项目中一般都会依赖三方组件,需要去模拟三方组件,所以测试函数的依赖项越少越好测试
- 模拟三方组件,不要直接使用实体类型(struct),应该使用抽象接口
package test
import (
"errors"
"time"
)
/*
*
1.假设 AlySendMessage 是三方的短信发送服务,间歇性抽风,你的测试还用跑吗
*/
type AlySendMessage struct{}
func (aly AlySendMessage) Send() error {
if time.Now().Unix()%2 == 0 {
return errors.New("AlySendMessage 就是报错")
}
return nil
}
func Send(s AlySendMessage) error {
return s.Send()
}
/**
1. Send 只接受 AlySendMessage struct,导致不可模拟
2. SendNew 接受的是抽象接口,非常容易模拟
*/
type SendMessage interface {
Send() error
}
func SendNew(s SendMessage) error {
return s.Send()
}
type MockAlySendMessage struct{}
func (m MockAlySendMessage) Send() error {
return nil
}
常用的mock工具
- https://github.com/golang/mock
- https://github.com/DATA-DOG/go-sqlmock
- https://github.com/jarcoal/httpmock
- https://github.com/bouk/monkey
除了单元测试,每次对提交的代码进行 review code 也非常重要,有助于提高代码质量。如果你想要整个团队都去落实代码审查机制,那么一定要建立一套审核规范。
编程哲学
面向接口
依赖接口,而不依赖具体实现。依赖接口能解耦、易扩展、易测试
面向对象
Go不支持面向对象,但能实现类似的功能
- 类对应结构体
- 继承对应结构体嵌入
- 多肽靠接口
设计模式
我认为设计模式是对特定场景开发的总结,能够指导我们在特定的场景中写出最优的代码
SOLID原则
面向对象设计的五个指导原则,描述了好的代码应该的样子
- 单一原则:一个类的功能应该单一(职责)
- 开闭原则:对扩展开发,对修改关闭
- 里氏替换原则: 子类能够替换父类
- 依赖倒置: 依赖抽象(接口),而不依赖具体实现(实例)
- 接口分离原则: 依赖它所依赖的,而不应该依赖其所不需要的(本质要求接口颗粒度要适中)
项目管理
使用工具
使用三方提供的工具,减少开发者的工作,如使用gotests生成单元测试模板
Makefile
编写辅助的命令:如项目初始化,工具的安装等 …
自动生成代码
只要程序能帮你生成一部分代码,你的工作量就减轻了。而且程序比人更不容易出错
CI/CD
使用CI/CD 来帮助你查漏补缺(规范检查、静态检查,编译等…)文章来源:https://www.toymoban.com/news/detail-426678.html
项目文档
项目文档好好写哦,作用大着呢文章来源地址https://www.toymoban.com/news/detail-426678.html
- 减少后期沟通成本,这个很重要,节省自己的时间,也节省别人的时间
- 文档也算绩效的一部分
- 写文档的时候可以对思路进行梳理
- 知识传承,把你踩过的坑写进去,让后面的人不要再踩了
到了这里,关于如何写出好的Go项目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!