创建Go工程化项目布局详解

 更新时间:2022年09月26日 14:26:49   作者:范闲  
这篇文章主要介绍了创建Go工程化项目布局详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

如果你尝试学习Go,或者你正在为自己建立一个Poc或者一个玩具项目,这个项目布局是没有啥必要的,从一些简单的事情开始(一个main文件绰绰有余)。当有更多的人参与这个项目的时候,你讲需要更多的结构,包括需要一个tookit来方便生成项目的模板,尽可能大家统一的工程目录布局

本文章围绕github.com/golang-stan… 进行说明

/cmd

本项目的主干。 每个应用程序的目录名应该与你想要的可执行文件的名称相匹配(例如:/cmd/myapp)

不要在这个项目中放置太多的代码,如果你认为代码导入并在其他项目中使用,那么他应该位于/pkg目录中,如果代码不是可重用的,或者你不希望其他人重用他,请将该代码放到/internal目录中。

/internal

不希望对外进行共享的代码,internal目录中也可以放置一些子包结构,已做到更加细化的切分,如:

|--internal
|   |
|   |--demo
|       |--biz
|       |--data
|       |--service

/pkg

外部应用程序可以使用的代码库,(例如:/pkg/publiclib)其他项目会导入这些代码库,所以放入到该目录下的代码要三思~注意:/internal目录是确保私有包不可导入的私有方法,因为他是由Go在编译时强制执行的。/pkg 仍然是一种更好的方式,可以显示的表示目录中的代码对于其他人来说是安全使用的好方法。

/pkg目录内可以参考GO标准库的组织形式,按照功能分类,/internal/pkg一般用于项目内的,跨多个应用的公共共享代码,但是其作用域仅在单个工程内。

|--pkg
|  |
|  |--cache
|  |   |--memcache
|  |   |--redis
|  |
|  |--conf
|      |--dsn
|      |--env
|      |--flagvar
|      |--paladin

/docs,/example,/pkg,/third_parth,/tools

这些跟上文说的/pkg/internal都同属根目录下的目录结构

  • /docs 放置一些项目说明文档
  • /example 放置一些项目的使用示例
  • /thrid_parth 三方的一些依赖文件,如:idl文件
  • /tools 放置一些项目的脚手架工具,代码生成工具等

基础库项目布局

每个公司都应该为不同的微服务建立一个统一的kit基础包工具集。 基础库tookit为一个独立的项目,公司级建议只有一个,按照功能来拆分会带来不少的管理工作,因此建议并整合

kit包应该具备的特点

  • 统一
  • 标准库方式布局
  • 高度抽象
  • 支持插件

例如下面的布局

|--cache
|    |--memcache
|         |--test
|    |--redis
|         |--test
|--conf
|    |--dsn
|    |--env 
|    |--flagvar
|    |--paladin
|          |--apollo
|               |--internal
|                     |--mockserver
|--container
|    |--group
|    |--pool
|    |--queue
|         |--aqm
|--database
|    |--hbase
|    |--sql
|    |--tidb
|--echo
|    |--types
|--log
|    |--internal
|         |--core
|         |--filewriter
|

应用程序项目布局

/api

API协议定义目录, xxapi.proto protobuf文件以及生成go的文件,我们通常把api文档定义在proto 文件中描述

/configs

配置文件模板或者默认配置

/test

额外的外部测试应用程序和测试数据,你可以随时根据需求构造测试目录,对于较大的项目,有一个数据子目录是有意义的,例如你可以使用/test/testdata(如果你需要忽略目录中的内容)请注意,Go还会以“.”或者“_”开头的目录或者文件,因此在如何命名测试数据目录方便,有着很大的灵活性。

不应该包含/src目录

有些Go项目确实有src目录,这是因为开发人员通常有Java的开发背景。

/internal

/biz

业务逻辑的组装层,类似DDD中的domain,

/data

业务数据访问,包含cache和db等封装,实现了biz的repo接口,我们可能会把data和dao混合在一起,data偏重业务的含义,他所做的是将领域对象重新拿出来,我们去掉了DDD的infra层,

/service

实现了api定义的服务层,类似DDD的applocation层,处理DTO到biz领域实体的转换,(DTO->DO)同事协同个类biz交互,但是不应该处理复杂逻辑

布局示意图

|--api
|--configs
|--test
|--internal
|       |--biz
|       |--data
|       |--service

数据流向

以上就是创建Go工程化项目布局详解的详细内容,更多关于Go工程化项目布局的资料请关注脚本之家其它相关文章!

相关文章

  • Go语言reflect.TypeOf()和reflect.Type通过反射获取类型信息

    Go语言reflect.TypeOf()和reflect.Type通过反射获取类型信息

    这篇文章主要介绍了Go语言reflect.TypeOf()和reflect.Type通过反射获取类型信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • GoLang使goroutine停止的五种方法实例

    GoLang使goroutine停止的五种方法实例

    goroutine是Go并行设计的核心,下面这篇文章主要给大家介绍了关于GoLang使goroutine停止的五种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Go语言学习之结构体和方法使用详解

    Go语言学习之结构体和方法使用详解

    这篇文章主要为大家详细介绍了Go语言中结构体和方法的使用,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下
    2022-04-04
  • golang框架gin的日志处理和zap lumberjack日志使用方式

    golang框架gin的日志处理和zap lumberjack日志使用方式

    这篇文章主要介绍了golang框架gin的日志处理和zap lumberjack日志使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • golang开发中channel使用

    golang开发中channel使用

    channel[通道]是golang的一种重要特性,正是因为channel的存在才使得golang不同于其它语言。这篇文章主要介绍了golang开发中channel使用,需要的朋友可以参考下
    2020-09-09
  • golang 并发安全Map以及分段锁的实现方法

    golang 并发安全Map以及分段锁的实现方法

    这篇文章主要介绍了golang 并发安全Map以及分段锁的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Go语言操作Excel利器之excelize类库详解

    Go语言操作Excel利器之excelize类库详解

    Excelize是Go语言编写的用于操作Office Excel文档基础库,基于ECMA-376,ISO/IEC 29500国际标准,可以使用它来读取、写入由Excel 2007及以上版本创建的电子表格文档,下面这篇文章主要给大家介绍了关于Go语言操作Excel利器之excelize类库的相关资料,需要的朋友可以参考下
    2022-10-10
  • 详解Go语言实现线性查找算法和二分查找算法

    详解Go语言实现线性查找算法和二分查找算法

    线性查找又称顺序查找,它是查找算法中最简单的一种。二分查找,也称折半查找,相比于线性查找,它是一种效率较高的算法。本文将用Go语言实现这两个查找算法,需要的可以了解一下
    2022-12-12
  • Go语言学习之context包的用法详解

    Go语言学习之context包的用法详解

    日常Go开发中,Context包是用的最多的一个了,几乎所有函数的第一个参数都是ctx,那么我们为什么要传递Context呢,Context又有哪些用法,底层实现是如何呢?相信你也一定会有探索的欲望,那么就跟着本篇文章,一起来学习吧
    2022-10-10
  • Go语言结构体Go range的学习教程

    Go语言结构体Go range的学习教程

    这篇文章主要为大家介绍了Go语言结构体Go range的学习教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论