
情况是这样的
模块结构如下
/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 这个怎么解决呢
1 lvsshuttao 2023-05-23 17:19:43 +08:00 多建一个目录,把 interface 扔进去就好了 |
2 dzdh OP @lvsshuttao 只有这一种方法了吗 |
3 kkhaike 2023-05-23 17:43:08 +08:00 看起来 lz 在写一个 orm |
4 hzzhzzdogee 2023-05-23 17:43:42 +08:00 稍稍重构下呗, 提取公共的 |
5 wOuv7i4e7XxsSOR1 2023-05-23 17:45:57 +08:00 type alias |
6 Ayanokouji 2023-05-23 17:49:31 +08:00 1 楼说的对。java 的好多想法,在 go 里边用起来非常别扭 |
7 Nazz 2023-05-23 18:02:00 +08:00 控制程序启动加载顺序, 合理规划包结构 |
8 liarsa 2023-05-23 18:12:09 +08:00 通常情况下,是设计的不合理,不能用 java 的思想去套 go |
9 ignor 2023-05-23 18:46:10 +08:00 via iPhone 没写过 go ,但这种情况一般是因为 db 承载了太多功能,最好把功能拆解后让 db 去 import 它们 |
10 cp19890714 2023-05-23 19:55:23 +08:00 设计有问题,职责范围没有划分清楚 |
11 |
12 chotow 2023-05-23 20:15:30 +08:00 从名字看,db.go 应该用于放接口、公共产物,不应该去 import 具体的驱动 mysql.go ,后者应该去实现前者的接口 |
13 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 里自动注册 |
14 matrix1010 2023-05-23 21:13:30 +08:00 |
15 mrgeneral 2023-05-24 13:11:22 +08:00 设计不太合理。 db 是 interface ,mysql 是 implements ,咋能反向依赖呢? |