news 2026/6/10 16:33:49

设计模式-控制反转【golang】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式-控制反转【golang】

设计模式-控制反转【golang】

听不懂的概念

将程序中对象的创建、依赖管理的控制权,从代码内部转移到外部容器/框架

获取mysql数据,存入redis

packagemrimport("fmt""log""os""testing")typeDatabaseinterface{Query(sqlstring)string}typeCacheinterface{Set(key,valuestring)}// Mysql操作typeMySQLDatabasestruct{}func(db*MySQLDatabase)Query(sqlstring)string{returnfmt.Sprintf("MySQL result: %s",sql)}// Pg操作typePgDatabasestruct{}func(db*PgDatabase)Query(sqlstring)string{returnfmt.Sprintf("PgSQL result: %s",sql)}// Redis操作typeRedisCachestruct{}func(c*RedisCache)Set(key,valuestring){fmt.Printf("Redis set: %s = %s\n",key,value)}// 业务逻辑funcTestManual(t*testing.T){db:=&MySQLDatabase{}cache:=&RedisCache{}// 下面为业务逻辑代码user:=db.Query("SELECT * FROM users WHERE id=1")cache.Set("user:1",user)// ………………}

定义好了查询 mysql、设置 redis 的方法,TestManual需要做的事情是,查询 mysql 的值存入 redis

这时,TestManual方法需要依赖两个依赖DatabaseCache

当我的业务逻辑代码不变,需要更换一下两个依赖时,例如我要把mysql切换成PostgreSql时,那只能修改我的业务逻辑方法了,例如

// 业务逻辑funcTestManual(t*testing.T){// db := &MySQLDatabase{}db:=&PgSQLDatabase{}cache:=&RedisCache{}// 下面为业务逻辑代码user:=db.Query("SELECT * FROM users WHERE id=1")cache.Set("user:1",user)// ………………}

所以,我需要把依赖的这部分代码提出来,以后换库还是什么的,不去动我的业务逻辑方法->TestManual

换一种写法,添加一个RunUserService,叫做管理容器也好方法也好,总之是一块儿代码封装

packagemrimport("fmt""log""os""testing")typeDatabaseinterface{Query(sqlstring)string}typeCacheinterface{Set(key,valuestring)}// Mysql操作typeMySQLDatabasestruct{}func(db*MySQLDatabase)Query(sqlstring)string{returnfmt.Sprintf("MySQL result: %s",sql)}// Pg操作typePgSqlDatabasestruct{}func(db*PgSqlDatabase)Query(sqlstring)string{returnfmt.Sprintf("PgSQL result: %s",sql)}// Redis操作typeRedisCachestruct{}func(c*RedisCache)Set(key,valuestring){fmt.Printf("Redis set: %s = %s\n",key,value)}// 数据服务操作函数typeDataServiceHandlerfunc(db Database,cache Cache)funcRunUserService(handler DataServiceHandler){// 依赖代码迁移到这里db:=&MySQLDatabase{}// db := &PgSqlDatabase{}cache:=&RedisCache{}handler(db,cache)}// 业务逻辑funcTestManual(t*testing.T){RunUserService(func(db Database,cache Cache){// 下面为业务逻辑代码user:=db.Query("SELECT * FROM users WHERE id=1")cache.Set("user:1",user)})}

这种体现形式为 闭包回调函数+interface 的组合方式

我认为其本质还是回调函数,通过传递一段预定义代码块,在真正执行业务代码时调用栈返回去执行,结果再回到调用方这里

从而简化调用方的代码量

更多的关于依赖注入、控制反转的实现参考 https://blog.csdn.net/qq_37485347/article/details/142203484

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 10:51:58

STM32F103C8T6微控制器实战指南:从选型到项目开发全解析

STM32F103C8T6微控制器实战指南:从选型到项目开发全解析 【免费下载链接】STM32F103C8T6中文数据手册 本资源文件提供了STM32F103C8T6微控制器的中文数据手册。STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器,具有高性能、低功耗和低电压特性&…

作者头像 李华
网站建设 2026/6/10 10:49:46

仿宋_GB2312字体下载:MAC用户的终极中文排版解决方案

在数字文档排版和平面设计领域,选择一款合适的中文字体至关重要。今天为您推荐的仿宋_GB2312字体资源下载项目,是专为MAC操作系统设计的国家标准编码字体,能够满足您对中文文档排版的高标准要求。无论是撰写论文、设计海报还是制作专业报告&a…

作者头像 李华
网站建设 2026/6/10 10:51:42

《Nature Communications》发表狄拉克涡旋拓扑光子晶体光纤首次实验实现

前言摘要近日,我国科研团队在顶级期刊《自然通讯》上发表了一项具有里程碑意义的研究:全球首次实验制备出“狄拉克涡旋拓扑光子晶体光纤”(https://doi.org/10.1038/s41467-025-65222-z)。该光纤融合拓扑光子学前沿理论与光纤制备技术,实现宽…

作者头像 李华
网站建设 2026/6/10 10:54:13

快速掌握PSCAD:电力系统仿真实战完整指南

快速掌握PSCAD:电力系统仿真实战完整指南 【免费下载链接】乐健老师PSCAD培训PPT下载 乐健老师PSCAD培训PPT下载 项目地址: https://gitcode.com/open-source-toolkit/f9db7 解决电力系统仿真的核心痛点 电力系统仿真作为电气工程领域的核心技术&#xff0c…

作者头像 李华
网站建设 2026/6/10 10:51:09

Docker容器技术终极入门:3步解决环境部署难题

Docker容器技术终极入门:3步解决环境部署难题 【免费下载链接】udemy-docker-mastery Docker Mastery Udemy course to build, compose, deploy, and manage containers from local development to high-availability in the cloud 项目地址: https://gitcode.com…

作者头像 李华
网站建设 2026/6/10 10:50:45

LangChain-ChatChat:AI如何重构智能对话开发流程

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 使用LangChain-ChatChat框架开发一个电商智能客服系统,要求包含以下功能:1.支持多轮商品咨询对话 2.集成商品数据库查询 3.处理退换货政策问答 4.支持订单状…

作者头像 李华