情况是这样的
模块结构如下
/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 1
多建一个目录,把 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 1
稍稍重构下呗, 提取公共的
|
5
wOuv7i4e7XxsSOR1 2023-05-23 17:45:57 +08:00
type alias
|
6
Ayanokouji 2023-05-23 17:49:31 +08:00 2
1 楼说的对。java 的好多想法,在 go 里边用起来非常别扭
|
7
Nazz 2023-05-23 18:02:00 +08:00 1
控制程序启动加载顺序, 合理规划包结构
|
8
liarsa 2023-05-23 18:12:09 +08:00 1
通常情况下,是设计的不合理,不能用 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 1
设计有问题,职责范围没有划分清楚
|
11
DefoliationM 2023-05-23 19:58:22 +08:00 1
没设计好架构,重新搞搞,把接口都单独放一个包
|
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 1
首先一个问题是 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 ,咋能反向依赖呢? |