Golang Go语言中怎么解决循环依赖

发布于 1周前 作者 yuanlaile 来自 Go语言

情况是这样的

模块结构如下

/db/db.go: import db/drivers/mysql 
/db/drivers/mysql/mysql.go : import db 需要 db 里的一个 interface 约束
// mysql.go
func xxx(db.XxxxInterface)

/db/db_test.go: go test 报错循环依赖

真实使用场景可能是

import db
import db/drivers/mysql

那 test 这个怎么解决呢


Golang Go语言中怎么解决循环依赖

更多关于Golang Go语言中怎么解决循环依赖的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

19 回复

多建一个目录,把 interface 扔进去就好了

更多关于Golang Go语言中怎么解决循环依赖的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


只有这一种方法了吗

看起来 lz 在写一个 orm

稍稍重构下呗, 提取公共的

type alias

1 楼说的对。java 的好多想法,在 go 里边用起来非常别扭

控制程序启动加载顺序, 合理规划包结构

通常情况下,是设计的不合理,不能用 java 的思想去套 go

没写过 go ,但这种情况一般是因为 db 承载了太多功能,最好把功能拆解后让 db 去 import 它们

设计有问题,职责范围没有划分清楚

没设计好架构,重新搞搞,把接口都单独放一个包

从名字看,db.go 应该用于放接口、公共产物,不应该去 import 具体的驱动 mysql.go ,后者应该去实现前者的接口

首先一个问题是 db 是不是必须要 import driver ,或者说假如有 10 种 drivers 是不是要 import 10 次? db 是上层结构的话不应该依赖 driver 。可以参考官方的 sql( https://pkg.go.dev/database/sql)实现,通过 Register 来在 driver 里自动注册

设计不太合理。

db 是 interface ,mysql 是 implements ,咋能反向依赖呢?

请教一下关于 go 中包名的设计和创建。我以前是写 java 的

基于轻量级路由库写个 crud 项目练练手, 理清组件启动顺序和依赖关系以及请求生命周期, 遵循单一方向原则
request => controller => repo
subscribe => controller => repo
cron => controller => repo

公共的结构定义放到 types 文件夹, 公共的函数放到 utils 文件夹, 这两个包尽量减少项目內依赖.

在Golang中,循环依赖是一个常见的问题,它指的是两个或多个包之间相互引用,形成一个闭环,可能导致编译错误或运行时问题。以下是一些解决循环依赖的专业方法:

  1. 重构代码:检查代码结构,尝试将互相引用的部分拆分成独立的包,或者合并功能过于紧密的包,减少循环依赖的发生。
  2. 接口抽象:使用接口定义包之间的公共行为,通过接口进行通信,而不是直接引用其他包的具体实现,从而降低耦合度。
  3. 依赖注入:将依赖项作为函数或结构的参数来注入,避免在对象内部创建依赖,从而降低循环依赖的可能性。
  4. 延迟导入:使用import语句中的括号()来延迟导入依赖的包,直到它们实际上被使用时才导入,但需注意这并非根本解决之道。
  5. 第三方库:考虑使用如wire或kupard等第三方库,自动化管理依赖关系,确保依赖关系正确。
  6. 单向依赖与分层架构:设计单向依赖关系,避免双向依赖;同时,采用分层架构,如数据访问层、业务逻辑层和表示层,每层只依赖于它的下一层。

综上所述,解决Golang中的循环依赖需要综合考虑代码结构、接口设计、依赖注入、第三方库等多种方法。通过合理的设计和持续的代码审查,可以有效地避免循环依赖问题。

回到顶部