2020年12月

背景

对于大多数 Gopher 来说,编写 Go 程序会直接在目录建立 main.go,xxx.go,yyy.go……

不是说不好,对于小型工程来说,简单反而简洁明了,我也提倡小工程没必要整一些花里胡哨的东西。

毕竟 Go 语言作为现代微服务的开发新宠,各个方面都比较自由,没有很多约束。我想,这也是它充满活力的原因。

对于大型工程而言,或者团队协作中,没有明确的规范,只会使得项目越来越凌乱……

因为每个人的心中对代码的管理、组织,对业务的理解不完全是一致的。

我参考了 非官网社区的规范 以及公司的规范,谈谈平时是怎么组织的,希望我的理解,对大家有所帮助。

目录结构示例

.
├── api                          路由与服务挂接
├── cmd                          程序入口,可以有多个程序
│   └── server
│       ├── inject               自动生成依赖注入代码
│       └── main.go
├── config                       配置相关文件夹
├── internal                     程序内部逻辑
│   ├── database
│   │   ├── redis.go 
│   │   └── mysql.go
│   ├── dao                      数据库操作接口/实现
│   │   ├── dao_impls
│   │   │   └── user_impls.go
│   │   └── user.go              用户 DAO 接口
│   ├── svc_impls                服务接口实现
│   │   ├── svc_auth
│   │   └── svc_user
│   └── sdks                     外部 SDK 依赖
└── service                      服务接口定义
        ├── auth.go              认证服务定义
        └── user.go              用户服务定义

面向接口编程

正如你所看到的,我的目录结构将接口和实现分开存放了。

根据依赖倒置原则(Dependence Inversion Principle),对象应依赖接口,而不是依赖实现。

阅读全文