用 Go 开发接口服务--项目整体结构介绍

栏目: Go · 发布时间: 4年前

内容简介:通常一个项目我们建议分 dao service controller 三层 ,这样可以重用一些关键的部件,模块尽量趋于松耦合,分工明确便于维护。数据的传输方式,我们采用 JSON 格式数据发起 POST 请求,再返回 JSON 格式数据给终端,这样终端和服务端的数据格式都统一了,便于协调沟通,还可以提高数据传输过程中的安全性。但凡事不能绝对,主要还是统一规范,约定优于配置。上一章节我们快速编写一个 Web 服务器的时候,新建了项目 chapter01 根目录,现在在根目录下,继续新建 src、templat

通常一个项目我们建议分 dao service controller 三层 ,这样可以重用一些关键的部件,模块尽量趋于松耦合,分工明确便于维护。数据的传输方式,我们采用 JSON 格式数据发起 POST 请求,再返回 JSON 格式数据给终端,这样终端和服务端的数据格式都统一了,便于协调沟通,还可以提高数据传输过程中的安全性。但凡事不能绝对,主要还是统一规范,约定优于配置。

上一章节我们快速编写一个 Web 服务器的时候,新建了项目 chapter01 根目录,现在在根目录下,继续新建 src、template、static 三个文件夹,新建一个 config.ini 文件,然后再在 src 文件夹里新建 controller、service、dao、model、dbutil、common、util 几个文件夹(每个文件夹名就是一个个包),最后在这几个文件夹里,分别创建 init.go 文件,分别文件顶部指定各自的包名,如  controller 里的 init.go 文件,首行指定了 package controller,其他包同样的步骤操作。整个项目大致结构就构建好了。

项目 chapter01 整体的结构:

chapter01

│  config.ini                                

│  Gopkg.lock                                

│  Gopkg.toml                                

│  server.go                                 

├─media                                      

│  └─images                                  

├─src                                        

│  ├─common                                  

│  │      config_util.go                     

│  │      constant.go                        

│  │      init.go                            

│  │      service_util.go                    

│  │      upload_util.go                     

│  ├─controller                              

│  │      init.go                            

│  │      product.go                         

│  │      run_testcase.go                    

│  ├─dao                                     

│  │      init.go                            

│  │      product.go                         

│  │      product_photo.go                   

│  ├─dbutil                                  

│  │      sqlx_util.go                       

│  ├─model                                   

│  │      init.go                            

│  │      product.go                         

│  │      product_photo.go                   

│  ├─service                                 

│  │      init.go                            

│  │      product.go                         

│  │      product_photo.go                   

│  ├─test                                    

│  │      data.go                            

│  │      model.go                           

│  │      util.go                            

│  └─util                                    

│          file_util.go                      

│          http_util.go                      

│          image_util.go                     

│          init.go                           

│          pager_util.go                     

│          request_util.go                   

│          response_util.go                  

├─static                                     

│  ├─css                                     

│  ├─images                                  

│  └─js                                      

├─template                                   

│      run_api_test_index.html               

│      run_api_test_result.html              

└─vendor    

项目名为 chapter01 ,里面有 src、template、static 三个文件夹,src 里面存放 Go 的业务源代码,template 是 html、tmpl 模板文件,主要是渲染视图用的,static 是静态文件夹,存放一些 css、js、images 文件。其中 go build 编译的时候,templates 和 static 文件是不会编译的,这些文件和路径都原样保留,当前项目主要是提供服务类型的项目,可能有些文件夹暂时用不上,但为了项目的完整性讲解,所以有些典型的文件夹都会保留。

另外 chapter01 根目录下,还有 service.go、config.ini 两个关键文件, service.go 是程序的启动入口,上一章说过里面是一个 Web 服务器,config.ini 是项目配置文件,项目主要的配置参数都写在里面,项目启动时会把配置项一次性读取到内存里,项目按需使用即可。

着重说说 src 里面的子文件夹,src 有四个重要的 package 包 controller、service、dao、model 都是手动新建的文件夹,在里面新建业务 go 文件,每个文件夹相当于 package 包的概念。四个文件包就是我们项目常见的控制器层、业务服务层、数据操作层、实体结构层,这四个层,一般是从左到右调用的,这是他们的关系,比如 控制器层一般都是调用服务层的函数,而业务服务层调用数据操作层的函数,数据层调用实体层的结构体,一般不建议跨级调用,比如不建议 控制器越过服务层直接调用数据层操作层的函数,这样很混乱,不符合规范。不过 model 层的结构体属于底层的部分,可以同时被以上多层调用,它对于其他层来说,是共用的底层结构体,不受以上限制。

vendor 文件夹是依赖管理工具 dep 自动生成的,它存放着所有 dep 安装的类包源文件,根目录下的 Gopkg.lock 和  Gopkg.toml 是 dep 的专属配置文件,一般 Gopkg.lock 不需要开发者理会,请不要手动修改,而 Gopkg.toml 是核心的配置文件,开发者可以在里面定义哪些是必需包,哪些是可忽略包,定义包的版本号和路径等信息。

src 源文件里,除了重要的四个包,还有另外的 dbutil、util、common 三个包, dbutil 是专门实例化数据库 DB 对象的 工具 包。util 和 common 都是公共工具包,区别是 util 是和项目业务关联性不太紧密的工具包,可以在多个项目中共用的,不依赖项目的任何东西,一般里面的函数功能只使用 Go 内置的底层类包实现,而 common 和项目关联是非常密切的,甚至和项目的其他包存在依赖关系,如果把它移植到其他项目上,不一定行得通,它仅适合在自身项目上作用,它就是某个项目集合工具包,不是属于所有项目的,比如 common 包某个函数需要依赖 model 结构体,依赖 service 的函数,依赖 util 的函数,依赖外部配置属性等。所以从某种意义上来说 util 才是所有项目的工具包,依赖某个具体项目业务的函数,是不适合放在 util 包里的。

项目涉及 Product 产品、Product Photo 产品图片这两个业务模块,它们都很具有代表性,本系列教程把它们作为讲解对象,把典型的技术问题完整描述清楚。

小结

项目的包和文件的命名很讲究,整体上来看,每个层就是一个包,包里可以有若干个 go 文件,我们根据业务模块新建不同的文件。Go 语言的命名遵循驼峰式命名,但一般是指 go 文件里的代码命名,比如定义常量、变量和函数命名等,强烈建议采用标准的驼峰式命名,首字母大写的对象,表示对外公开,可跨包访问(它是公有对象),首字母小写的只限于自己所在包使用(它是私有对象);但在 Go 语言里,包名和文件名却是使用非驼峰式命名,而且都尽量使用单个词命名,比如 service 包,如果无法做到单个词,可通过下划线隔开,比如 product_photo.go 文件,也可不用下划线,比如 dbutil 包,就是由 db 和 util 两个词组成的,Go 语言开发团队对 package 包的命名,都喜欢小写的单个词命名,其次多个小写的词直接组合,不得已的时候才用下划线(很少见用下划线的包名);而包里的文件,也是一样的规则,不过下划线命名稍常见一些,项目更多规范,读者可以参照上章节的 Go 语言编码规范。


以上所述就是小编给大家介绍的《用 Go 开发接口服务--项目整体结构介绍》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python基础教程

Python基础教程

[挪] Magnus Lie Hetland / 袁国忠 / 人民邮电出版 / 2018-2-1 / CNY 99.00

本书包括Python程序设计的方方面面:首先从Python的安装开始,随后介绍了Python的基础知识和基本概念,包括列表、元组、字符串、字典以及各种语句;然后循序渐进地介绍了一些相对高级的主题,包括抽象、异常、魔法方法、属性、迭代器;此后探讨了如何将Python与数据库、网络、C语言等工具结合使用,从而发挥出Python的强大功能,同时介绍了Python程序测试、打包、发布等知识;最后,作者结合......一起来看看 《Python基础教程》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

html转js在线工具
html转js在线工具

html转js在线工具