0

0

Golang设计模式如何提升代码复用率

P粉602998670

P粉602998670

发布时间:2026-01-11 07:07:06

|

145人浏览过

|

来源于php中文网

原创

Go中应优先用interface+依赖注入替代硬编码依赖,将数据库、HTTP客户端等抽象为接口并作为参数传入构造函数,便于测试mock和环境切换;工厂函数统一创建复杂对象,策略模式用map[string]func封装算法分支,组合优于嵌套,通过embed接口实现横切逻辑复用。

golang设计模式如何提升代码复用率

用 interface + 依赖注入替代硬编码依赖

Go 没有类继承,但通过 interface 定义契约、用结构体实现、再把依赖作为参数传入,能轻松替换行为而不改调用方。硬编码 new(SomeService) 会锁死实现,导致相同逻辑在多个地方重复构造。

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • 把可变部分(如数据库、HTTP 客户端、缓存)抽象为 interface,例如 type UserRepository interface { GetByID(id int) (*User, error) }
  • 构造函数接收这些接口,而非具体类型: func NewUserService(repo UserRepository) *UserService
  • 测试时直接传入 mock 实现;上线时注入真实 DB 或内存缓存实现 —— 同一份业务逻辑复用在不同环境

工厂函数统一创建复杂对象

当结构体初始化需要校验、默认值填充、资源预分配(如连接池),或存在多种变体(FileLogger / CloudLogger),裸写 &Logger{...} 会散落在各处,难以收敛和升级。

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • 定义工厂函数,如 func NewLogger(cfg LoggerConfig) Logger,内部完成校验、默认值合并、资源初始化
  • 若需多态创建,返回 interface{} 或更具体的接口,避免暴露具体类型
  • 配置结构体用指针接收(func NewLogger(cfg *LoggerConfig)),方便 nil 判断和零值 fallback

策略模式用 map[string]func 封装算法分支

if/else 或 switch 处理支付方式、压缩算法、序列化格式时,新增一种实现就得改主逻辑,违反开闭原则,也容易漏掉某处的 case 分支。

阿里云AI平台
阿里云AI平台

阿里云AI平台

下载

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • 定义统一输入输出签名的函数类型: type Processor func([]byte) ([]byte, error)
  • map[string]Processor 注册所有策略:processors["gzip"] = gzipProcess
  • 运行时按 key 查找执行,新增策略只需注册,不碰调度代码
  • 注意并发安全:注册应在 init 阶段或加锁,运行时查表是无锁

组合优于嵌套:用 embed + 接口复用通用能力

想让多个结构体都具备重试、超时、日志打点能力,不要每个都重写 DoWithRetry 方法,也不要用匿名字段强行“继承”—— Go 的 embed 是编译期静态组合,必须配合接口才能动态替换行为。

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • 把横切逻辑抽成独立结构体,实现明确接口(如 type Retrier interface { Do(fn func() error) error }
  • 在业务结构体中 embed 该接口字段:retrier Retrier,而不是 embed 具体类型
  • 构造时注入不同实现(带 exponential backoff 的、mock 不重试的、测试用固定失败次数的)
  • 避免 embed 具体类型(如 retrier *DefaultRetrier),否则又回到强耦合
type Service struct {
    retrier Retrier
    db      Database
}

func (s *Service) CreateUser(u User) error {
    return s.retrier.Do(func() error {
        return s.db.Insert(&u)
    })
}
真正难的不是写出某个模式,而是判断什么时候该收口、什么时候该开放;比如一个 Processor map 看似灵活,但如果策略之间共享状态或需要生命周期管理,就得退回到接口+依赖注入。复用率高不高,最终看的是变化点是否被隔离到最小、最易替换的单元里。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

211

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

247

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

356

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

214

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

409

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

490

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

201

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

1499

2025.06.17

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 6.2万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号