news 2026/4/3 6:26:42

设计模式-控制反转【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/3/17 0:50:54

Vue.Draggable版本管理深度解析:从语义化规范到实战应用

Vue.Draggable版本管理深度解析:从语义化规范到实战应用 【免费下载链接】Vue.Draggable 项目地址: https://gitcode.com/gh_mirrors/vue/Vue.Draggable 在Vue.js生态系统中,Vue.Draggable作为最受欢迎的拖拽排序组件,其版本控制策略…

作者头像 李华
网站建设 2026/3/27 16:17:24

如何快速上手note-gen:AI笔记应用的终极入门指南

如何快速上手note-gen:AI笔记应用的终极入门指南 【免费下载链接】note-gen 一款专注于记录和写作的跨端 AI 笔记应用。 项目地址: https://gitcode.com/GitHub_Trending/no/note-gen note-gen是一款革命性的跨平台AI笔记应用,专为现代知识工作者…

作者头像 李华
网站建设 2026/3/31 14:55:43

Memento日语学习播放器:看剧学日语的终极解决方案

Memento日语学习播放器:看剧学日语的终极解决方案 【免费下载链接】Memento An mpv-based video player for studying Japanese 项目地址: https://gitcode.com/gh_mirrors/meme/Memento 还在为看日剧时遇到生词反复暂停而烦恼吗?Memento日语学习…

作者头像 李华
网站建设 2026/3/27 17:59:35

AI如何自动化adb push操作?提升开发效率

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个Python脚本,使用ADB命令自动将指定目录下的文件推送到连接的Android设备。脚本应包含以下功能:1. 自动检测连接的Android设备;2. 遍历指…

作者头像 李华
网站建设 2026/4/2 23:55:09

基于微信小程序的健身运动社区的设计与实现(源码+论文+部署+安装)

感兴趣的可以先收藏起来,还有在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望可以帮到大家。一、系统背景在 “健康中国 2030” 战略推进与移动互联网深度渗透的背景下,国民健身需求持续增…

作者头像 李华
网站建设 2026/3/23 4:58:52

医院智能问询的关键!医院RAG知识库设计解析

一、场景设定 面向患者/家属的问答(门诊就医流程、医保支付、检查准备、常见疾病宣教等); 知识来源:院内规章制度、公众号文章、患者宣教单、医保文件、业务流程 PPT、科室自制 FAQ、甚至 PDF 扫描件(图文)…

作者头像 李华