如何写出好的Go项目

这篇具有很好参考价值的文章主要介绍了如何写出好的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 来帮助你查漏补缺(规范检查、静态检查,编译等…)

项目文档

项目文档好好写哦,作用大着呢文章来源地址https://www.toymoban.com/news/detail-426678.html

  1. 减少后期沟通成本,这个很重要,节省自己的时间,也节省别人的时间
  2. 文档也算绩效的一部分
  3. 写文档的时候可以对思路进行梳理
  4. 知识传承,把你踩过的坑写进去,让后面的人不要再踩了

到了这里,关于如何写出好的Go项目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue项目上线打包好的文件如何在服务器上部署?

    1.打开router下的js文件,调成hash模式: mode:\\\'hash\\\'   2.终端输入: npm run build 3.此时项目中会多出一个dist的文件,这个文件就是我们打包出来的项目   (1)建立一个新的文件夹 (2)终端输入命令: npm init (3)输入: xxx_server (4)然后一路按回车到文件夹——框架完成,如下图

    2024年02月11日
    浏览(54)
  • 如何写出高质量代码?

    作为一名资深开发人员,写出高质量的代码是我们必须要追求的目标。然而,在实际开发中,我们常常会遇到各种问题。比如,代码的可读性、可维护性、健壮性和灵活性等,这些都会影响代码的质量。那么,究竟如何才能写出高质量的代码呢? 代码结构清晰易懂,能够使代

    2024年02月02日
    浏览(52)
  • 如何写出高质量代码

    一、 前言 编写高质量代码是每一位程序员的追求。高质量的代码可以提高代码可读性、可维护性、可扩展性以及软件运行的性能和稳定性。在这篇文章中,我将分享一些编写高质量代码的特征、编程实践技巧和软件工程方法论。 可读性:好的代码应该能够被维护者轻易地理

    2024年02月02日
    浏览(81)
  • 如何规范写出 README 模板?

    README 标准是由 RichardLitt 发起,十多名开发者共同贡献完成的,在 GitHub 上有 1230+ Star:standard-readme 标准 README 实例: standard-readme/tree/main/example-readmes 奖励:实例 本文模板获取地址: README-Template README 文件是人们通常最先看到的第一个东西。它应该告诉人们为什么要使用、如

    2024年02月11日
    浏览(33)
  • 如何写出10万+ Facebook 贴文?

    想要创作一篇优秀的Facebook贴文,首先要考虑以下几个问题: 1.文案特点 一篇清晰简洁的文案有助于受众在有限的浏览时间内快速了解你想要展示的信息。根据以往经验,文案内容最好保持在20个汉字以内,加上链接描述最好也不要超过50个汉字。 在品牌调性允许的情况下,

    2023年04月12日
    浏览(29)
  • 如何使用ChatGPT写出优质文章

    2024年省钱、快速订阅ChatGPT方法 1. 确定主题和目的 细化主题 :选择一个具体且明确的主题,例如,“气候变化对欧洲农业的影响”而不仅仅是“气候变化”。 写作目标 :明确文章的最终目标。例如,是为了影响政策、提高公众意识、学术研究还是娱乐性质的写作。 2. 提供

    2024年01月19日
    浏览(59)
  • 如何写出高质量的代码

    你是否曾经为自己写的代码而感到懊恼?你是否想过如何才能写出高质量代码?那就不要错过这个话题!在这里,我们可以讨论什么是高质量代码,如何写出高质量代码等问题。无论你是初学者还是资深开发人员,都可以在这个话题下进行分享,汲取灵感和知识,共同提高自

    2023年04月25日
    浏览(122)
  • 如何设计一个优秀的 Go Web 项目目录结构

    Go 语言作为一门高效、简洁、并发安全的语言,越来越受到开发者们的青睐,特别是在 Web 开发及云原生领域。而对于一个大型的 Go Web 项目而言,一个优秀的目录结构设计是必不可少的。它可以帮助我们更好地组织代码、减少冗余、提高可维护性和可扩展性。 在本文中,我

    2024年02月12日
    浏览(95)
  • 一文讲解如何写出高效精致SQL

    尽量避免select * from,仅返回所需字段         在日常查询表数据时,经常不自觉的写select * from,查询全部字段信息;虽然记录少的单表没啥感觉,但当关联多个表且表体量大时,select * from将返回所有表的字段,会影响查询效率。较好的方式,就是需要什么查什么, 仅返回

    2024年02月09日
    浏览(33)
  • 如何才能写出一个符合预期的正则?

    随着爬虫日益普及,很多人开始捡起了正则,做一些简单的信息提取处理,越来越多的个性化正则表达式的需求,可还是有很多人不知道怎么下手,无法编写出一个强壮的正则,毕竟看起来和乱码差不多。 老顾这里用几个问答小伙伴的例子,来简单说一下,正则的写法。 不

    2023年04月21日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包