DevopsCamp 第 2 期作业: 《cobra - 05 Go 项目的目录结构》

2023-11-04

DevopsCamp 第 2 期作业: 《cobra - 05 Go 项目的目录结构》

原文链接: https://typonotes.com/posts/2023/02/13/devopscamp-cobra-05-layout/

Go 项目的目录结构

Go 项目的目录结构, 通常都会参考该项目 Go语言规范/项目结构 - Github

这是一个社区规范, 遵守这个规范, 大家都会很轻松。 但并不是严格的 Go 语言标准, 实际操作中各个公司可能会有自己的标准。

另外, 在上述的 Github 仓库中可以看到, 所有 目录功能 都只有一层。 这样就意味着在实际使用时我们是可以自由组合。 只要遵守该层的功能约定就可以了。

例如, 使用 cobra 时, 用于管理命令的 cmd 目录, 位置可以是

/cmd/appname/cmd

# 或
/pkg/cmd/

# 或
/internal/pkg/cmd

# 或
/pkg/internal/cmd

关于这个没有必要钻牛角尖, 只要是一群相对固定的维护人员认同的约定, 就可以了。

internal

internal 包是是特殊的, 也是 Go 语言规范 强制 约束的。

  1. 首先, 它的目录位置不是固定的, 和其他包一样。
  2. 其次, 它的访问是受限的, 只有和他有 近亲亲属关系 的路径才能访问。

举个例子, 代码在 https://github.com/tangx-labs/go-internal-demo

代码目录树如下

限制访问

在上图中, 其中 (2) 的调用因为没有权限被限制

/cmd/appname/cmd/say 访问 pkg/internal/master 时,

  1. 找到与 /pkg/cmd 是相同层级。
  2. 但是 /pkg/internal 是子层级, 与 /cmd/appname 是同一层级。
  3. 因此属于 远亲, 不能直接调用 /pkg/internal/master

公共方法暴露

但是, 可以通过 私有包的公共方法暴露, 例如上图中的 (3)

  1. /pkg/hello/pkg/internal 是同级, 且是 近亲, 可以调用。
  2. /pkg/hello 是公共的
  3. /cmd/appname/cmd/say 可以通过调用 /pkg/hello 间接实现调用 master 的逻辑。(

更多详细信息, 可以阅读 internal 运行机制

那 internal 是不是就一定不能被访问了呢? 也不一定, 可以参考 突破限制,访问其它Go package中的私有函数

包命名规范

关于包的命名规范, Go 官方是有明确说明的, 但是 没有强制约束

要求

  1. 短,好记,有意义bytes, io, os
  2. 小写字母。 多个单词使用 连字符(-) 连接, 不要使用 蛇形(下划线) 或者 驼峰qcloud-cdn-sdk

更多信息, 参考 effective_go

函数/方法,变量命令

  1. 大写开头是公共, 小写开头是私有: 这个就不多说了
  2. 命名不要与包名有重复: 假如包名为 bytes
    1. 函数名就不用叫 BytesReader 了, 否则调用起来就是 bytes.BytesReader
    2. 函数名就叫 Reader 就好了, 调用起来就是 bytes.Reader
  3. 命令要有意义: 见名知义。
  4. 命名要遵循 驼峰 规则。

循环依赖

这个就不多说了, 学了基础的都应该知道, 相关文章一搜一大把。

这个是 Go 语言的 强制约束。 换句话说, 不用等到编译, 在写代码的时候 IDE 就会提示你出现错误。

互相吹捧, 共同进步

欢迎和我一起学习进步, 如果有什么问题, 可以给我私信留言。 或者

  1. 加我好友 线下讨论。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DevopsCamp 第 2 期作业: 《cobra - 05 Go 项目的目录结构》 的相关文章

随机推荐

  • 使用思维导图,优雅的完成自己的代码

    我自己常常在写代码的时候 会突然搞不清变量用来干嘛的 也会被理不清的逻辑搞得自己异常烦躁 我甚至常常暗示自己我不适合写代码 思维总是那么不清晰 直到我发现了思维导图的妙用 最开始使用思维导图的时候 我其实是用来记知识点的 然而某一刻就灵光一
  • Scrum是用来发现问题的

    原文链接作者 Mark Levison 机械的Scrum对比真正的Scrum 差别在哪里 最近 我和一个朋友聊到了他们公司实施Scrum的情况 他们有些迷茫 在实施Scrum之前 他们经常为了访问一台测试机而不得不等上一个小时 甚至更多时间
  • 单例模式 - 饿汉式与懒汉式详解

    什么是单例模式 对于一个软件系统中的某些类而言 只有一个实例很重要 就像Windows中的任务管理器一样 只能打开一个 如果不适用机制对窗口对象进行唯一化 必定会弹出多个窗口 如果这些窗口显示的内容完全一致 则是重复对象 浪费内存资源 如果
  • H2数据库攻略之一-简介

    1 H2数据库介绍 常用的开源数据库 H2 Derby HSQLDB MySQL PostgreSQL 其中H2 HSQLDB类似 十分适合作为嵌入式数据库使用 其它的数据库大部分都需要安装独立的客户端和服务器端 H2的优势 1 h2采用纯
  • jQuery qTip2提示插件 (示例图,API)

    author YHC 首先介绍一下 主要的作用 用作网页中的提示 例如新手入门的导航 看下图你就明白了 当然这个插件在提示上功能非常丰富 下面主要介绍下载地址 以及入门的一个最小的 例子 qTip2官网下载地址 qTip2官网推荐下载地址
  • Android webView去除默认边框

    Android WebView无论怎么修改它的属性都会存在一定的边距 这是因为 HTML 的 body 标签默认存在一定边距 修改 webView 的属性并没有作用 解决办法 修改 html 代码 html data 原本需要加载的html
  • KaTeX

    KaTeX LaTeX数学公式编辑手册 只需要在第三列写法前后分别加上 就可以转换为符号 但需注意 CSDN的使用的是 KaTeX KaTeX KATE X数学公式 而不是 LaTeX LaTeX LATE X 两者会有些许区别 如果有
  • 漂亮的计算器页面 html,html+css实现一个好看的计算器实例代码

    最终效果如下图 2 有bug 就是整数后点击 号结果正确 如果小数后面点击 的话结果就错误 其他都正常 求指点 input的value是string类型的 在JS中改如何正确处理下图 1中的if部分 图 1 图 2 HTML代码如下 简单的
  • 【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了

    由于文章有点多 并且发的文章也不是一个系列一个系列发的 不过我的文章大部分都是围绕着 数据结构 算法 计算机网络 操作系统 Linux 数据库 这几个方面发的 为了方便大家阅读 我整理了一波 不过公众号可以说是不支持修改文章 因为我决定每两
  • Java环境从删除到重装

    Java环境从删除到重装 前言 须知 如何完全删除jdk 安装jdk 前言 今天由于一些原因把Java环境删除了 怎么装都装不好 遇到了很多错误 在网上找了好多解决办法之后终于弄好了 所以写成一份Java环境从删除到重装 给各位不小心删除J
  • Centos7下基于jdk11 安装RocketMQ

    1 简介 RocketMQ是阿里巴巴中间件团队自研的一款高性能 高吞吐量 低延迟 高可用 高可靠 具备金融级稳定性 的分布式消息中间件 开源后并于2016年捐赠给Apache社区孵化 目前已经成为了 Apache顶级项目 当前在国内被广泛的
  • 用html+js实现代码背景墙特效【建议收藏】

    在csdn里面 有些博主的主页非常的帅 就是代码从上往下掉的特效 那么这种效果我们作为程序员该如何去写出来呢 不用担心 这篇博客就分享如何创建一个代码背景墙 1 效果展示 2 代码分享
  • java.io.FileNotFoundException: http://www.xxxxx.net:8080/test/test/ 403错误

    POST请求错误内容 java io FileNotFoundException http www xxxxx net 8080 test test at libcore net http HttpURLConnectionImpl get
  • python 中的六种“复制”方法

    以列表为例 方法一 直接变量赋值 将 li 赋值给变量 li1 打印他们的id会发现 他们的id是一样的 即是 li 和 li1 这两个变量在python中是同一个内存地址 对他们任何一个变量进行修改 另外一个会跟着变化 li 1 2 3
  • arm体系结构概述和编程模型

    1 arm体系结构的版本 1 arm1 6 2 arm体系的变种 1 T 系列 Thumb指令集 可以支持Thumb指令集 2 M系列 支持长乘法 32位 32位生成64位数据 长乘加指令 再加上32位数据 3 E系列 增强型DSP指令 增
  • 【Go语言(golang)教程】A Tour of Go 七十集大全

    http www aqee net go a tour of go 5 Go语言 golang 教程 A Tour of Go 1 Hello World Go语言 golang 教程 A Tour of Go 2 安装离线练习器 Go语言
  • 数字电子钟 1Hz 秒脉冲信号的设计

    数字电子钟 1Hz 秒脉冲信号的设计 摘 要 要设计数字钟 首先应选择一个能产生稳定的标准时间脉冲信号 而脉冲源产生的脉冲信号的频率较高 因此 需要进行分频 使高频脉冲信号变成适合于计时的低频脉冲信号 即 秒脉冲信号 频率1HZ 1引言 数
  • 找出看了5个电影以上的用户

    问题 在1亿条用户记录里 如何快速查询统计出看了5个电影以上的用户 解答 分以下几个步骤完成 1 建立 hash map lt 用户 电影数 gt 2 顺序扫描1亿条用户记录 1 如果 用户 在hash map中不存在 则新增并设 电影数
  • IT项目管理之第5章 项目时间管理习题之案例分析汇总

    IT项目管理之第5章 项目时间管理习题之案例分析汇总 项目时间管理习题之案例分析汇总 案例1 案例分析 案例1参考答案 案例2 案例2分析 案例2参考答案 叮嘟 这里是小啊呜的学习课程资料整理 好记性不如烂笔头 今天也是努力进步的一天 一起
  • DevopsCamp 第 2 期作业: 《cobra - 05 Go 项目的目录结构》

    DevopsCamp 第 2 期作业 cobra 05 Go 项目的目录结构 原文链接 https typonotes com posts 2023 02 13 devopscamp cobra 05 layout Go 项目的目录结构 G