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

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

内容简介:通常一个项目我们建议分 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 开发接口服务--项目整体结构介绍》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Algorithm Design

Algorithm Design

Jon Kleinberg、Éva Tardos / Addison-Wesley / 2005-3-26 / USD 144.20

Algorithm Design introduces algorithms by looking at the real-world problems that motivate them. The book teaches students a range of design and analysis techniques for problems that arise in compu......一起来看看 《Algorithm Design》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具