The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
dzdh

怎么解决循环依赖

  •  
  •   dzdh · May 23, 2023 · 3609 views
    This topic created in 1263 days ago, the information mentioned may be changed or developed.

    情况是这样的

    模块结构如下

    /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 replies  •  2023-06-26 09:58:48 +08:00
    lvsshuttao
    lvsshuttao
    May 23, 2023❤️1
    1
    多建一个目录,把 interface 扔进去就好了
    dzdh
    dzdh
    OP
    May 23, 2023
    2
    @lvsshuttao 只有这一种方法了吗
    kkhaike
    kkhaike
    May 23, 2023
    3
    看起来 lz 在写一个 orm
    hzzhzzdogee
    hzzhzzdogee
    May 23, 2023❤️1
    4
    稍稍重构下呗, 提取公共的
    wOuv7i4e7XxsSOR1
    wOuv7i4e7XxsSOR1
    May 23, 2023
    5
    type alias
    Ayanokouji
    Ayanokouji
    May 23, 2023❤️2
    6
    1 楼说的对。java 的好多想法,在 go 里边用起来非常别扭
    Nazz
    Nazz
    May 23, 2023❤️1
    7
    控制程序启动加载顺序, 合理规划包结构
    liarsa
    liarsa
    May 23, 2023❤️1
    8
    通常情况下,是设计的不合理,不能用 java 的思想去套 go
    ignor
    ignor
    May 23, 2023 via iPhone
    9
    没写过 go ,但这种情况一般是因为 db 承载了太多功能,最好把功能拆解后让 db 去 import 它们
    cp19890714
    cp19890714
    May 23, 2023❤️1
    10
    设计有问题,职责范围没有划分清楚
    DefoliationM
    DefoliationM
    May 23, 2023❤️1
    11
    没设计好架构,重新搞搞,把接口都单独放一个包
    chotow
    chotow
    May 23, 2023
    12
    从名字看,db.go 应该用于放接口、公共产物,不应该去 import 具体的驱动 mysql.go ,后者应该去实现前者的接口
    matrix1010
    matrix1010
    May 23, 2023❤️1
    13
    首先一个问题是 db 是不是必须要 import driver ,或者说假如有 10 种 drivers 是不是要 import 10 次? db 是上层结构的话不应该依赖 driver 。可以参考官方的 sql( https://pkg.go.dev/database/sql)实现,通过 Register 来在 driver 里自动注册
    mrgeneral
    mrgeneral
    May 24, 2023
    15
    设计不太合理。

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

    公共的结构定义放到 types 文件夹, 公共的函数放到 utils 文件夹, 这两个包尽量减少项目內依赖.
    trzzzz
    trzzzz
    Jun 26, 2023
    18
    @Nazz 感谢~~~
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1922 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 56ms · UTC 07:48 · PVG 15:48 · LAX 23:48 · JFK 02:48
    ♥ Do have faith in what you're doing.