「建议收藏」 十篇文章带你 Golang Cobra 入门到实战(含源码讲解)

大家好, 我是老麦。 一头专注 GolangK8s 的胖熊猫。

如果在 公众号 文章发现状态为 已更新, 建议点击 查看原文 查看最新内容。

状态: 未更新

原文链接: https://typonotes.com/posts/2023/03/02/cobra-book/

Cobra 知识点讲解

时间不知不觉到了 3 月, 我们的 DevOpsCamp 也到了 第4期。 在前面的内容中, 我尝试通过将 cobra 拆解成一个个功能, 并进行解释和扩展。 希望能带领大家逐步进入 Go 开发的世界。

其实这些都不难, 但是由于刚接触到一个未知的东西的时候, 总是有一种茫然无措, 不知道如何下手的烦躁和不安。 这个也是我当初入门的时遇到的困境。

希望大家在完成了这部分练习之后, 能自信的回过头来说一句 原来不过如此嘛

1. 第一个命令: 创建并使用 Makefile 管理交叉编译

第一步总是最简单的, 但也是最重要的。

本文中, 我们将一起使用 cobra 创建一个最简单的命令。 并且使用 Makefile 实现交叉编译的管理。 让一切都简单起来。

  1. 第一个命令: 创建并使用 Makefile 管理交叉编译

2. 配置文件管理: 读取和写入 JSON 和 YAML

交互, 总是从数据开始, 到数据结束。

JSONYAML 作为配置管理最常用的两种格式, 另外就是 ini, toml, xml。 尤其是 JSON, 在 HTTP 请求中基本山更可以是做 默认的 的数据传递格式了。

本文中, 我们将学习如何, (1) 如何读取和写入文件。 (2)如何从一种结构转换为另一种结构, 以及一些常用方法和函数命名的变种。

  1. 配置文件管理: 读取和写入 JSON 和 YAML

3. 交互式命令: 使用 survey 让你的命令更友好

一个好的工具, 一定是简单好用的。

在本文中, 我们将使用 survey 实现命令提示、选择等功能。 一方面可以减少用户使用的学习成本, 另一方面减少用户输入可以增加我们工具的健壮性。

  1. 交互式命令: 使用 survey 让你的命令更友好

4. Golang 项目结构: 让你的项目更具维护性

项目越大,功能越多,越需要模块化管理。

在本文中, 我们将一起阅读一些文档, 包括官方和社区的。 了解 Golang 目录的 命名规则 以及 组合方式。 同时展开介绍特殊的 internal 目录。

  1. Golang 项目结构: 让你的项目更具维护性

5. Cobra 子命令: 「cobra 命令树」 与 「gin 的路由树」 的实现差异(源码)

要致富先修路, 多生孩子多种树。

在本文中, 我们将通过 Cobra 子命令为切入点, 一起学习源码, 讲解 Cobra 是如何组合 链表 实现命令树的。 将简单介绍一下 gin 路由树的实现逻辑 与 Cobra 的不同点。

  1. Cobra 子命令: 「cobra 命令树」 与 「gin 的路由树」 的实现差异(源码)
  2. 读源码学习 cobra 如何使用 「链表」 实现命令树。(源码)

另外, 我们对 gin 进行了二次封装, 模拟 Cobra 的方式实现路由树。

  1. 代码封装练习: 模仿 cobra 链表方式实现 gin 路由树: https://github.com/tangx-labs/gin-cobra-demo

6. Cobra 持久参数: 聊聊 Golang 引用类型 的使用陷阱(源码)

画虎画皮难画骨, 知人知面不知心

本文中, 我们将继续一切学习 Cobra 的源码, 一起找出 Cobra 子命令 真正的父命令, 通过这个案例讲解 Golang 引用类型 的使用陷阱。

  1. Cobra 持久参数: 聊聊 Golang 引用类型 的使用陷阱(源码)

7. Cobra 命令自动补全方案: 让你操作飞起来(官方文档)

磨刀不误砍柴工, 读完硕士再打工

本文是 Cobra 官方页面, 配置你的 Shell 终端, 完成命令自动补全。 让操作飞起来。

  1. Cobra 命令自动补全方案: 让你操作飞起来(官方文档): https://github.com/spf13/cobra/blob/main/shell_completions.md
  2. Zsh 用户可以直接按照此文档配置: https://github.com/zsh-users/zsh-completions

8. cobrautils 扩展库: 使用 struct 聚合 Flag 参数列表(支持指针类型)

君子性非异也, 善假于物也。

cobrautils 是我写的一个 cobra 扩展库, 目的是为了通过 Struct 方便 的管理所有 flag 和默认值。

  1. cobrautils 扩展库: 使用 struct 聚合 Flag 参数列表(支持指针类型)
  2. Github 项目地址: https://github.com/go-jarvis/cobrautils

9. Golang interface: 一个案例给你讲清楚「接口实现」和「注意事项」

门前大桥下, 游过一群鸭

众所周知, Golang 的接口是鸭子类型。

本文中, 将介绍什么是 鸭子类型? Struct 如何实现接口? 以及接口在使用过程中的一些常用方法。

  1. Golang interface: 一个案例给你讲清楚「接口实现」和「注意事项」

10. Golang Context: 用 “故事” 和 “源码” 帮搞懂核心知识「值传递」(源码)

如果愿意一层一层的剥开我的心, 你会发现我心底最深的秘密

上下文 Context 应该是 Go语言 中一个极其重要的 基石 概念了。

本文中, 我们将一起学习 Golang Context 的源码, 一起掌握核心知识 值传递。 同时将通过一个案例 着重 说明 值传递 的过程、用法和注意事项。

  1. Golang Context: 用 “故事” 和 “源码” 帮搞懂核心知识「值传递」(源码)

实战练习

本次实战练习我们只做一个事情, 用 cobra 写一个 命令行 的 dns 客户端。把我们之前已经掌握了一些基本招式, 运用起来, 形成自己的拳法。

整个脑图,我整理如下。 没有思路的朋友可以根据这个脑图进行。

cobra-dnsx-mindmap.jpg

在脑图中, 05 扩展 中有一个 接口定义。 最终我们要实现多运营商截图。 因此在前期设计和实现的时候, 可以多考虑一下 扩展性 的问题。

补充: 本次 dns 解析上, 我用的是 dnspod, 也就是腾讯云。 选择其他大厂也一样, 都有完整的 SDK。

这里有一个很久之前练习写的 tangx/dnsx - Github : https://github.com/tangx/dnsx , 权当参考。

配置

添加

删除