DevopsCamp 第 2 期作业: 《cobra - 05 Cobra 的子命令》 简单说下 cobra 命令树和 gin 路由树的实现差异
DevopsCamp 第 2 期作业: 《cobra - 05 Cobra 的子命令》 简单说下 cobra 命令树和 gin 路由树的实现差异
原文链接: https://typonotes.com/posts/2023/02/14/devopscamp-cobra-05-subcommand/
cobra 的子命令
在 cobra 中, 每个 命令 都是独立的。 通过 parent.AddCommand(children)
的形式进行串连。
|
|
没了, 应用上就这么多。
cobra 命令树
如果你用过 gin 的路由树的话, 可能会对 cobra 的命令树实现更为深刻。
删除多余的结构, cobra 节点 就是下面这样的。
|
|
当进行 命令树 组合的时候, 是通过 领养/挂靠 的方式实现的。
|
|
(1)
在我们可以在任意节点调用 Execute
方法, 这个调用会通过 递归 找到最上层的 根 节点。
|
|
再来看一次 Command 结构体定义
|
|
(2)
通过将传入的命令保存到 []*Command
切片中, 实现了命令树的 组合 。
|
|
且同时 实现了 同一个命令挂载到多个父命令上
|
|
commands
是一个切片, 用于保存 挂载 上来的子命令。 但是, 这里需要注意, 由于 *Command
是指针类型, 意味着在任何修改, 都可能影响其他调用的地方。
对于 sub2
而言, (a)
处父节点是 root
。 (b)
处父节点是 sub1
。 最终父节点是 sub1
。
但不影响 sub2
同时是 root
和 sub1
的子命令。
总体来说, cobra 命令节点 独立而又统一
gin 的路由树
与 cobra 相比, gin 的路由树实现就是另外一种方式了, 我称之为 生长。 换句话说, gin 路由的子节点不能独立于父节点 单独 定义。
|
|
从上面代码可以看出来, RouterGroup
是通过 Group
方法实现路由节点 生长 的, 在调用 Group
方法的时候,
- 必须 要传入 子节点 的相对路径
- 使用私有方法计算出
basePath
的值。
这个特别像怀孕生孩子, 一代接一代。 绝对错不了。 O.o
。
gin 的 RouterGroup 能实现 认亲/挂靠 模式吗?
肯定可以, 做个变形手术就好了。 这里挖个坑吧。
- 原文链接:https://typonotes.com/posts/2023/02/14/devopscamp-cobra-05-subcommand/
- 本文为原创文章,转载注明出处。
- 欢迎 扫码关注公众号
Go与云原生
或 订阅网站 https://typonotes.com/ 。 - 第一时间看后续精彩文章。觉得好的话,请猛击文章右下角「在看」,感谢支持。