入 Go 的坑,大佬分享下你们的项目结构 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
imherer
V2EX    程序员

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

  •  
  •   imherer 2019-01-16 11:12:56 +08:00 15344 次点击
    这是一个创建于 2462 天前的主题,其中的信息可能已经有所发展或是发生改变。
    谢过各位大佬啦
    第 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.onfig.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

    ```
    dV9zZM1wROuBT16X
        30
    dV9zZM1wROuBT16X  
       2019-08-11 18:43:10 +08:00
    @mritd 我很好奇,请问你是怎么实现 mysql 单例的,只用一个连接
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5812 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 06:30 PVG 14:30 LAX 23:30 JFK 02:30
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86