怎么解决循环依赖

2023-05-23 17:07:12 +08:00
 dzdh

情况是这样的

模块结构如下

/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 这个怎么解决呢

2555 次点击
所在节点    Go 编程语言
18 条回复
lvsshuttao
2023-05-23 17:19:43 +08:00
多建一个目录,把 interface 扔进去就好了
dzdh
2023-05-23 17:22:37 +08:00
@lvsshuttao 只有这一种方法了吗
kkhaike
2023-05-23 17:43:08 +08:00
看起来 lz 在写一个 orm
hzzhzzdogee
2023-05-23 17:43:42 +08:00
稍稍重构下呗, 提取公共的
wOuv7i4e7XxsSOR1
2023-05-23 17:45:57 +08:00
type alias
Ayanokouji
2023-05-23 17:49:31 +08:00
1 楼说的对。java 的好多想法,在 go 里边用起来非常别扭
Nazz
2023-05-23 18:02:00 +08:00
控制程序启动加载顺序, 合理规划包结构
liarsa
2023-05-23 18:12:09 +08:00
通常情况下,是设计的不合理,不能用 java 的思想去套 go
ignor
2023-05-23 18:46:10 +08:00
没写过 go ,但这种情况一般是因为 db 承载了太多功能,最好把功能拆解后让 db 去 import 它们
cp19890714
2023-05-23 19:55:23 +08:00
设计有问题,职责范围没有划分清楚
DefoliationM
2023-05-23 19:58:22 +08:00
没设计好架构,重新搞搞,把接口都单独放一个包
chotow
2023-05-23 20:15:30 +08:00
从名字看,db.go 应该用于放接口、公共产物,不应该去 import 具体的驱动 mysql.go ,后者应该去实现前者的接口
matrix1010
2023-05-23 21:12:55 +08:00
首先一个问题是 db 是不是必须要 import driver ,或者说假如有 10 种 drivers 是不是要 import 10 次? db 是上层结构的话不应该依赖 driver 。可以参考官方的 sql( https://pkg.go.dev/database/sql)实现,通过 Register 来在 driver 里自动注册
matrix1010
2023-05-23 21:13:30 +08:00
mrgeneral
2023-05-24 13:11:22 +08:00
设计不太合理。

db 是 interface ,mysql 是 implements ,咋能反向依赖呢?
trzzzz
2023-06-26 08:49:09 +08:00
@Nazz 请教一下关于 go 中包名的设计和创建。我以前是写 java 的
Nazz
2023-06-26 09:15:42 +08:00
@trzzzz 基于轻量级路由库写个 crud 项目练练手, 理清组件启动顺序和依赖关系以及请求生命周期, 遵循单一方向原则
request => controller => repo
subscribe => controller => repo
cron => controller => repo

公共的结构定义放到 types 文件夹, 公共的函数放到 utils 文件夹, 这两个包尽量减少项目內依赖.
trzzzz
2023-06-26 09:58:48 +08:00
@Nazz 感谢~~~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/942322

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX