请教各位,模块化分离之后,如何解决循环引用的问题

最近在写一个 Web 应用,主要提供 API 接口

项目目录结构大概是这样

├── config
├── controller
│   ├── address
│   ├── admin
│   ├── auth
│   ├── banner
│   ├── downloader
│   ├── email
│   ├── finance
│   ├── invite
│   ├── menu
│   ├── message
│   ├── news
│   ├── notification
│   ├── oauth2
│   ├── report
│   ├── resource
│   ├── role
│   ├── system
│   ├── transfer
│   ├── uploader
│   ├── user
│   └── wallet
├── exception
├── message_queue
├── middleware
├── model
├── rbac
│   ├── accession
│   └── role
├── schema
├── service
│   ├── database
│   ├── dotenv
│   ├── email
│   ├── redis
│   └── token
└── util

现在功能还少,可以把各个部分放在一个目录,但是随着功能不断增加,目录文件不断增加,比如 model/schema/controller 文件夹

目前想把这些功能分离,模块化。

例如

- modules
  - user
    - user.model.go
    - user.schema.go
    - user.controller.go
    - user.service.go
  - 其他模块...

这样分离的好处的显而易见的,功能模块都放在一起。

但是这样就可能会有循环引用。

举个例子:

A.controller.go 引用 B.schema.go
B.controller.go 引用 A.schema.go

在其他语言,一个文件是一个模块,可以单独导入一个文件,这样不会有循环引用,但是 Golang 按文件夹作为模块,所有就有了循环依赖。

所以请问各位大佬,请问有什么好的解决办法吗?或者更好的目录/模块划分

共 4 个回复


zhutou

顶,我也在想这个事情

# 0

HobaiRiku

应该抛弃这种思维,在go的模块中,模块是不允许存在互相关联的指针,如果关联,说明这两个模块的关系在设计上不合理,这时候你需要使用接口等特性,使用第三个包等去解开这个循环。所以不要为了语义和方便,使用其他语言的习惯来写go。

# 1

jIAnSoft

2樓正解

我剛入門 GO 時也是用其他的語言的思維來寫GO,寫的亂七八糟的,後有前輩指點,你用其他語言的思維就用該語言就好了,用它來寫GO 作毛啊。

# 2

Dempsey

这问题很傻。 出现循环引用 说明你结构设计的不合理。你应该从结构层面下手,而不是想些小聪明去糊弄过去

# 3