go项目开发结构求解

我想请问下大家在做go项目开发的时候目录结构一般是怎样的呢?是分模块开发,每个模块有自己的controller、dao、entity、service层,还是统一都丢一个controller文件夹下面呢?我是从java转来自学go的,我在做java项目的时候习惯分模块化,但是go语言包名是只有一级结构,假如有systemoamember 模块,Java的包名可以是

  • com.baidu.cms.module.system.controller
  • com.baidu.cms.module.system.dao
  • com.baidu.cms.module.system.service

但是go语言的话好像system文件夹下面有controller包、member文件夹下面也有controller包,这样的话在一个go文件里面导入这些包的话只能取别名了比如

import sysCtrl "system/controller"
import memberCtrl "member/controller"
阅读 3.1k
2 个回答

golang没有固定的项目layout, 只有合适自己项目的,就是最好的.

  1. 如果项目足够简单,你可以只需要 controller, controller可以操作数据库
  2. 如果复杂一点, 你可以加一层model, 给controller调用
  3. 如果再复杂一点, 需要各种封装, 那么你需要一层service
  4. 如果复杂到加一层 service 无法满足 前后端 , 数据组装等问题, 你可以再加一层转门的transform

.
├── Makefile
├── assets
│   ├── static
│   └── template
├── cmd
│   └── server
├── config
│   └── config.go
├── config.yaml
├── go.mod
├── go.sum
├── internal
│   ├── http
│   └── sms
├── pkg
│   ├── es
│   ├── ext
│   └── id
├── prod.yaml
├── scripts
│   ├── generate.sh
│   └── start.sh
├── static
│   ├── assets
│   ├── bootstrap
│   └── imgs
├── template
│   ├── default
└── test
    └── inites.go

关于导入. 楼主你使用导入的方式不是推荐的方式. 建议看下 go mod,
并且使用全路劲导入包.

比如上述例子中
cmd/server 想调用 internal/http包,并且go mod初始化的包名为 example.com/app

那么应该是:

import "example.com/app/internal/http"

_ = http.SomeFunc()

看了你的提问,一般来说,从设计逻辑来说不存在controller相互调用的可能性吧?
通常拆分不应该是所有的controller放在controller下面吗?
类似于:

/controller
---- user.go
---- order.go
/dao
---- user.go
---- order.go
/service
---- user.go
---- order.go

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题