V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imherer
V2EX  ›  程序员

入 Go 的坑,大佬分享下你们的项目结构

  •  
  •   imherer · 2019-01-16 11:12:56 +08:00 · 14662 次点击
    这是一个创建于 1898 天前的主题,其中的信息可能已经有所发展或是发生改变。
    谢过各位大佬啦🤗
    第 1 条附言  ·  2019-01-16 13:36:47 +08:00
    感谢各位的回复

    可能部分人被 #1 贴目录结构给带偏了

    我想要的是 #13 这样的结果,即单个项目的目录结构,至于是使用 go mod 还是放在 GOPATH 里这个看个人习惯了

    再次感谢所有各位的回复!
    30 条回复    2019-08-11 18:43:10 +08:00
    zicla
        1
    zicla  
       2019-01-16 11:19:54 +08:00   ❤️ 3
    我来说说我开源的云盘 https://github.com/eyebluecn/tank 吧,采用前后端分离,后端使用 golang 编写,项目结构基本上遵循官方建议的结构:

    ```
    golang #环境变量 GOPATH 所在路径
    ├── bin #编译生成的可执行文件目录
    ├── pkg #编译生成第三方库
    ├── src #golang 工程源代码
    │   ├── github.com #来自 github 的第三方库
    │   ├── golang.org #来自 golang.org 的第三方库
    │   ├── tank #clone 下来的 tank 根目录
    │   │   ├── build #用来辅助打包的文件夹
    │   │   │   ├── conf #默认的配置文件
    │   │   │   ├── doc #文档
    │   │   │   ├── html #前端静态资源,从项目 tank-front 编译获得
    │   │   │   ├── pack #打包的脚本
    │   │   │   ├── service #将 tank 当作服务启动的脚本
    │   │   ├── dist #运行打包脚本后获得的安装包目录
    │   │   ├── rest #golang 源代码目录
    │   │   │   ├── ... #golang 源代码 不同文件用前缀区分
    │   │   ├── .gitignore #gitignore 文件
    │   │   ├── CHNAGELOG #版本变化日志
    │   │   ├── DOCKERFILE #构建 Docker 的文件
    │   │   ├── LICENSE #证书说明文件
    │   │   ├── main.go #程序入口文件
    │   │   ├── README.md #README 文件
    ```
    mosliu
        2
    mosliu  
       2019-01-16 11:28:23 +08:00   ❤️ 1
    类似楼上
    但是没放系统的 GOPATH 里面
    放到了某目录下面的
    src\github.com\mosliu\项目名
    mosliu
        3
    mosliu  
       2019-01-16 11:28:49 +08:00
    gopath 加上这个项目就好 现在觉得 go mod 挺好用
    imherer
        4
    imherer  
    OP
       2019-01-16 11:29:31 +08:00
    @mosliu 嗯,我也是在用 go mod
    jlkm2010
        5
    jlkm2010  
       2019-01-16 11:29:32 +08:00
    使用 go mod
    scukmh
        6
    scukmh  
       2019-01-16 12:13:32 +08:00
    go mod~\(≧▽≦)/~万岁
    fyibmsd
        7
    fyibmsd  
       2019-01-16 12:20:56 +08:00   ❤️ 2
    zhujinliang
        8
    zhujinliang  
       2019-01-16 12:22:08 +08:00 via iPhone
    目前还没能接受 go mod 等模式,只习惯 gopath,每个项目单独 gopath
    davex
        9
    davex  
       2019-01-16 12:24:27 +08:00   ❤️ 2
    https://zhuanlan.zhihu.com/p/48039838 最近入坑 Golang,参照了一下知乎的技术栈升级的文章,大部分还是蛮有用的
    tomoya92
        10
    tomoya92  
       2019-01-16 12:29:07 +08:00 via iPhone   ❤️ 1
    我就在根目录下开发的 https://github.com/tomoya92/pybbs-go
    gamexg
        11
    gamexg  
       2019-01-16 12:47:02 +08:00   ❤️ 1
    . # 项目根路径
    ├── cmd/
    │ ├── aaa/ # 可执行文件 aaa 目录,一般这个目录只放个 main.go 、配置文件例子等少数内容。具体代码在 common/aaa/ 下。
    │ ├── main.go
    ├── common/ # 项目内部库
    │ ├── aaa/ # 可执行文件 aaa 的具体内容,不过具体各个功能会拆分到 common 下独立目录
    │ ├── lib1/ # 项目拆分的模块 1
    │ ├── lib2/ # 项目拆分的模块 2

    配合 go mod
    reus
        12
    reus  
       2019-01-16 12:52:14 +08:00
    全放一个目录
    mritd
        13
    mritd  
       2019-01-16 12:59:45 +08:00   ❤️ 3
    自己弄了个基于 gin 的 mvc 的架子 https://github.com/mritd/ginmvc
    还没完善完,仅供参考

    ```sh
    .
    ├── Dockerfile
    ├── LICENSE
    ├── Makefile
    ├── README.md
    ├── auth
    │   ├── casbin.go
    │   ├── consts.go
    │   └── jwt.go
    ├── cache
    │   ├── gocache.go
    │   └── redis.go
    ├── conf
    │   └── config.go
    ├── db
    │   ├── gormrus.go
    │   └── mysql.go
    ├── ginengine
    │   └── engine.go
    ├── ginmvc.yaml
    ├── go.mod
    ├── go.sum
    ├── main.go
    ├── middleware
    │   ├── jwt.go
    │   ├── log.go
    │   ├── middleware.go
    │   ├── rbac.go
    │   ├── recovery.go
    │   └── session.go
    ├── models
    │   ├── auto_migrate.go
    │   ├── test_module.go
    │   └── user.go
    ├── resources
    ├── routers
    │   ├── health.go
    │   ├── router.go
    │   ├── static.go
    │   ├── templates.go
    │   ├── user.go
    │   └── web.go
    ├── static
    │   ├── css
    │   ├── img
    │   ├── js
    │   └── webfonts

    ├── templates
    │   └── index.html
    ├── utils
    │   ├── char.go
    │   └── common.go
    └── version.go
    ```
    88250
        14
    88250  
       2019-01-16 13:00:57 +08:00   ❤️ 1
    sunjourney
        15
    sunjourney  
       2019-01-16 14:45:17 +08:00
    @zicla 你的结构不分领域全放 rest package 下呀
    menghan
        16
    menghan  
       2019-01-16 14:55:47 +08:00
    用什么结构,要看你的项目是库,是 framework,还是完整的 program。
    my3157
        17
    my3157  
       2019-01-16 16:08:44 +08:00
    zicla
        18
    zicla  
       2019-01-16 16:37:24 +08:00
    @sunjourney 这个项目不大,于是全部放到 rest 这个 package 下面了。 如果是很庞大的项目,自然需要按照模块来划分了,不过 golang 里面的跨 package 引用需要注意处理一下
    bzshow1
        19
    bzshow1  
       2019-01-16 17:17:50 +08:00   ❤️ 1
    hekunhotmail
        20
    hekunhotmail  
       2019-01-16 17:18:56 +08:00
    收藏
    leiuu
        21
    leiuu  
       2019-01-16 17:24:17 +08:00
    @zicla 请教一下,这种目录结构的是怎么打印出来的呢
    hpeng
        22
    hpeng  
       2019-01-16 17:35:35 +08:00
    @leiuu tree
    zicla
        23
    zicla  
       2019-01-16 17:38:34 +08:00
    @leiuu 就是用那几个特殊字符,一行一行的排布 没啥高级的技巧。。。
    coldwarm7
        24
    coldwarm7  
       2019-01-16 17:45:10 +08:00
    可以参考一下 beego 的结构目录
    YingJie
        25
    YingJie  
       2019-01-16 19:17:40 +08:00 via Android
    @leiuu win 下 tree
    pythondean
        26
    pythondean  
       2019-01-16 23:43:30 +08:00 via iPhone
    @my3157 这个有点大,国情是大部分都是用来写 api.大佬有没有简化版的
    workwonder
        27
    workwonder  
       2019-01-17 09:49:40 +08:00 via Android
    我刚入坑 golang 一月左右,做了一个小小项目。
    感觉 go mod 是一个本来就该这样的模式,不知道为什么值得称赞,大概是之前那种操作太变态了。我也是在项目即将做好时才尝试 go mod 的,感觉释然。
    workwonder
        28
    workwonder  
       2019-01-17 10:01:09 +08:00   ❤️ 1
    这是我第一个 golang 项目的目录结构,一个很简单的评论服务。

    ```
    ➜ talk git:(master) tree .
    .
    ├── config.sample.yaml
    ├── db-migrations
    │   ├── 20190102173600-init-schema.sql
    │   ├── 20190109170100-rename-tags.sql
    │   └── README.txt
    ├── Dockerfile
    ├── go.mod
    ├── go.sum
    ├── README.md
    ├── server.go
    └── talk
    ├── api.go
    ├── config.go
    ├── config_test.go
    ├── core.go
    ├── db.go
    ├── errors.go
    ├── logging.go
    ├── mid_auth0.go
    ├── mid_method_override.go
    ├── mid_request_id.go
    ├── router.go
    ├── utils_http.go
    ├── utils_tags.go
    └── utils_test.go
    ```
    motecshine
        29
    motecshine  
       2019-01-17 11:56:42 +08:00   ❤️ 1
    ```
    .
    ├── README.md
    ├── actors
    │   ├── reactor.go
    │   └── worker.go
    ├── configs
    │   ├── configs.go
    │   ├── prod.config.yaml
    │   └── test.config.yaml
    ├── containers
    │   └── container.go
    ├── db
    │   ├── redis.go
    │   └── tidb.go
    ├── debug.py
    ├── helpers
    │   └── logs.go
    ├── logs
    │   ├── ParkInfo.log
    │   └── ParkInfo.log.20190117093012
    ├── main.go
    ├── prod.env
    ├── queue
    │   └── mq.go
    ├── start.sh
    ├── test.env
    ├── v3_older
    │   ├── handlers
    │   │   ├── common.go
    │   │   ├── heartbeat.go
    │   │   └── parkinfo.go
    │   ├── models
    │   │   ├── park_channel.go
    │   │   └── park_equipment.go
    │   └── proto
    │   ├── proto.go
    │   └── v4043.go
    └── v4
    ├── handlers
    │   ├── common.go
    │   ├── heartbeat.go
    │   └── parkinfo.go
    ├── models
    │   ├── park_info_connect.go
    │   ├── park_info_option.go
    │   └── park_info_space.go
    └── proto
    ├── common.go
    ├── park_connect.go
    ├── park_option.go
    └── park_space.go

    ```
    Flourite
        30
    Flourite  
       2019-08-11 18:43:10 +08:00
    @mritd 我很好奇,请问你是怎么实现 mysql 单例的,只用一个连接
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4271 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 10:13 · PVG 18:13 · LAX 03:13 · JFK 06:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.