V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
dzdh
V2EX  ›  Go 编程语言

怎么解决循环依赖

  •  
  •   dzdh · 2023-05-23 17:07:12 +08:00 · 2554 次点击
    这是一个创建于 581 天前的主题,其中的信息可能已经有所发展或是发生改变。

    情况是这样的

    模块结构如下

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

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

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

    公共的结构定义放到 types 文件夹, 公共的函数放到 utils 文件夹, 这两个包尽量减少项目內依赖.
    trzzzz
        18
    trzzzz  
       2023-06-26 09:58:48 +08:00
    @Nazz 感谢~~~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5365 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:48 · PVG 15:48 · LAX 23:48 · JFK 02:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.