如何写出好的Go项目

前言

老生常谈,还是从三个方面讲

  1. Go应用
  2. 项目管理
  3. 项目文档

Go应用

代码结构
目录结构

Go 项目目录结构设计

模块拆分
  1. 按层拆分,如经典的MVC三层结构,缺点是容易循环引用

ac305d583118aae7aecc2349d480880.jpg

  1. 按功能拆分,功能单一,出现循环引用的概率小。按功能拆分,后期拆微服务更方便些。

bb4a38eb79f7b0b7c2c00465eb91e59.jpg

代码规范
编码规范

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 工具生成测试代码,来减轻工作量

  1. 由于项目中一般都会依赖三方组件,需要去模拟三方组件,所以测试函数的依赖项越少越好测试

022552e7e4676560303ef3ec9fdd57d.jpg

  1. 模拟三方组件,不要直接使用实体类型(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工具

  1. https://github.com/golang/mock
  2. https://github.com/DATA-DOG/go-sqlmock
  3. https://github.com/jarcoal/httpmock
  4. https://github.com/bouk/monkey

除了单元测试,每次对提交的代码进行 review code 也非常重要,有助于提高代码质量。如果你想要整个团队都去落实代码审查机制,那么一定要建立一套审核规范。

编程哲学
面向接口

依赖接口,而不依赖具体实现。依赖接口能解耦、易扩展、易测试

面向对象

Go不支持面向对象,但能实现类似的功能

  1. 类对应结构体
  2. 继承对应结构体嵌入
  3. 多肽靠接口
设计模式

我认为设计模式是对特定场景开发的总结,能够指导我们在特定的场景中写出最优的代码

SOLID原则

面向对象设计的五个指导原则,描述了好的代码应该的样子

  1. 单一原则:一个类的功能应该单一(职责)
  2. 开闭原则:对扩展开发,对修改关闭
  3. 里氏替换原则: 子类能够替换父类
  4. 依赖倒置: 依赖抽象(接口),而不依赖具体实现(实例)
  5. 接口分离原则: 依赖它所依赖的,而不应该依赖其所不需要的(本质要求接口颗粒度要适中)

项目管理

使用工具

使用三方提供的工具,减少开发者的工作,如使用gotests生成单元测试模板

Makefile

编写辅助的命令:如项目初始化,工具的安装等 …

自动生成代码

只要程序能帮你生成一部分代码,你的工作量就减轻了。而且程序比人更不容易出错

CI/CD

使用CI/CD 来帮助你查漏补缺(规范检查、静态检查,编译等…)

项目文档

项目文档好好写哦,作用大着呢

  1. 减少后期沟通成本,这个很重要,节省自己的时间,也节省别人的时间
  2. 文档也算绩效的一部分
  3. 写文档的时候可以对思路进行梳理
  4. 知识传承,把你踩过的坑写进去,让后面的人不要再踩了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值