当前位置: 首页 > news >正文

cobra - 更容易地构建命令行应用

cobra 是什么

cobra 的主要功能是创建强大的现代 cli 应用程序。目前市面上许多的著名的 Go 语言开源项目都是使用 Cobra 来构建的,例如:K8s、Hugo、etcd、Docker 等,是非常可靠的一个开源项目。

没有 cobra 之前用什么

如果不用 cobra,我们也可以使用 go 自带的 flag 标准库

flag 的基本用法

下面代码中,我们调用标准库 flagStringVar 方法实现了对命令行参数 name 的解析和绑定,其各个形参的含义分别为命令行标识位的名称、默认值、帮助信息。

命令行参数支持如下三种命令行标志语法:

  • -flag 仅支持布尔类型
  • -flag x 仅支持非布尔类型
  • -flag=x 均支持
package mainimport ("flag""fmt"
)func main() {var name string// 名称为 name、默认值为 "Go go go!"flag.StringVar(&name, "name", "Go go go!", "帮助信息")flag.StringVar(&name, "n", "Go go go!", "帮助信息")flag.Parse()fmt.Printf("name: %s\n", name)
}

执行:

// 均输出 abc
go run main.go -name=abc
go run main.go -n=abc

子命令实现

在我们日常使用的 CLI 应用中,另一个最常见的功能就是子命令的使用,一个工具它可能包含大量相关联的功能命令以此形成工具集,可以说是刚需,那么这个功能在标准库 flag 中可以如何实现呢,如下述示例:

package mainimport ("flag""log"
)var name stringfunc main() {flag.Parse()args := flag.Args()if len(args) == 0 {return}switch args[0] {case "go":goCmd := flag.NewFlagSet("go", flag.ExitOnError)goCmd.StringVar(&name, "name", "Go 语言", "帮助信息")_ = goCmd.Parse(args[1:])case "php":phpCmd := flag.NewFlagSet("php", flag.ExitOnError)phpCmd.StringVar(&name, "n", "PHP 语言", "帮助信息")_ = phpCmd.Parse(args[1:])}log.Printf("name: %s", name)
}

在上述代码中,我们首先调用了 flag.Parse 方法,将命令行解析为定义的标志,便于我们后续的参数使用。

另外由于我们需要处理子命令的情况,因此我们调用了 flag.NewFlagSet 方法,该方法会返回带有指定名称和错误处理属性的空命令集给我们去使用,相当于就是创建了一个新的命令集去支持子命令了。

这里需要特别注意的是 flag.NewFlagSet 方法的第二个参数是 ErrorHandling,用于指定处理异常错误,其内置提供以下三种模式:

const (// 返回错误描述ContinueOnError ErrorHandling = iota// 调用 os.Exit(2) 退出程序ExitOnError// 调用 panic 语句抛出错误异常PanicOnError
)
➜ go run main.go go    
2022/08/04 08:59:21 name: Go 语言
➜ go run main.go php  
2022/08/04 09:00:54 name: PHP 语言
➜ go run main.go php -n abc   
2022/08/04 09:01:05 name: abc

使用 cobra

安装:

go get -u github.com/spf13/cobra

示例:

package mainimport ("fmt""github.com/spf13/cobra""log"
)func main() {var wordCmd = &cobra.Command{Use:   "test",         // 子命令的命令标识Short: "测试",           // 简短说明Long:  "测试 cobra 子命令", // 完整说明Run: func(cmd *cobra.Command, args []string) {fmt.Println(args)},}var rootCmd = &cobra.Command{}rootCmd.AddCommand(wordCmd)err := rootCmd.Execute()if err != nil {log.Fatalf("cmd.Execute err: %v", err)}
}

在上面的例子中,我们添加了一个 test 子命令,使用:

➜  go run main.go test abc
[abc]

这里把 wordCmdrootCmd 都写在一块不是一个好的实践,如果命令多的情况下,这个文件会非常大。

相关文章:

cobra - 更容易地构建命令行应用

cobra 是什么 cobra 的主要功能是创建强大的现代 cli 应用程序。目前市面上许多的著名的 Go 语言开源项目都是使用 Cobra 来构建的,例如:K8s、Hugo、etcd、Docker 等,是非常可靠的一个开源项目。 没有 cobra 之前用什么 如果不用 cobra&am…...

windows10设置多个jar后台开机自启

1、window10启动多个jar包的脚本 新建一个txt文档,将以下内容复制到文档中: echo off taskkill /f /im javaw.exe //停用之前启动过的所有后台javaw程序 d: //jar包所在盘符 cd saas //jar包所在文件夹 start cmd /c "title 程序…...

数据库||数据库相关知识练习题目与答案

目录 1.只能读取本系学生的信息? 2.要查询选修“Computer”课的男生姓名,将涉及到关系( ) 3.实体完整性规则规定( ) 4.下列有关范式的叙述中正确的是( ) 5.从课程表course&…...

YOLOv8改进 | 损失函数篇 | 更加聚焦的边界框损失Focaler-IoU、InnerFocalerIoU(二次创新)

一、本文介绍 本文给大家带来的改进机制是更加聚焦的边界框损失Focaler-IoU已经我进行二次创新的InnerFocalerIoU同时本文的内容支持现阶段的百分之九十以上的IoU,比如Focaler-IoU、Focaler-ShapeIoU、Inner-Focaler-ShapeIoU包含非常全的损失函数,边界框的损失函数只看这一…...

利用nginx宝塔免费防火墙实现禁止国外IP访问网站

本章教程,主要介绍,如何利用nginx宝塔面板中的插件免费防火墙,实现一键禁止国外IP访问网站。 目录 一、安装宝塔插件 二、 开启防火墙 一、安装宝塔插件 在宝塔面板中的软件商店,搜索防火墙关键词,找到Nginx免费防火…...

消息中间件(MQ)对比:RabbitMQ、Kafka、ActiveMQ 和 RocketMQ

前言 在构建分布式系统时,选择适合的消息中间件是至关重要的决策。RabbitMQ、Kafka、ActiveMQ 和 RocketMQ 是当前流行的消息中间件之一,它们各自具有独特的特点和适用场景。本文将对这四种消息中间件进行综合比较,帮助您在项目中作出明智的…...

MySQL索引原理以及SQL优化

案例 struct index_failure_t{int id;string name;int cid;int score;string phonenumber;}Map<int,index_failure>; 熟悉C的同学知道&#xff0c;上述案例中&#xff0c;我们map底层是一颗红黑树&#xff0c;一个节点存储了一对kv&#xff08;键值对&#xff09;&…...

[Bug] [OpenAI] [TypeError: fetch failed] { cause: [Error: AggregateError] }

[Bug] [OpenAI] [TypeError: fetch failed] { cause: [Error: AggregateError] } ubuntu20 win10 edge浏览器访问 服务器部署 页面打开后想使用chatgpt报错了 rootcoal-pasi1cmp:/www/wwwroot/ChatGPT-Next-Web# PORT3000 yarn start yarn run v1.22.19 warning package.json:…...

@ 代码随想录算法训练营第5周(C语言)|Day31(贪心算法)

代码随想录算法训练营第5周&#xff08;C语言&#xff09;|Day31&#xff08;贪心算法&#xff09; Day31、贪心算法&#xff08;包含题目 455.分发饼干 376. 摆动序列 53. 最大子序和 &#xff09; 455.分发饼干 题目描述 假设你是一位很棒的家长&#xff0c;想要给你的孩…...

面试手写第二期 Promsie相关

文章目录 一. 手写实现PromiseA规范二. Promise.all实现三. Promise.race实现四. Promise.allsettled实现六. Promise.any实现六. 如何实现 Promise.map&#xff0c;限制 Promise 并发数七. 实现函数 promisify&#xff0c;把回调函数改成 promise 形式八. 并发请求控制 一. 手…...

Windows冷知识:最小化远程桌面与ffmpeg

Windows冷知识&#xff1a;最小化远程桌面与ffmpeg – WhiteNights Site 标签&#xff1a;ffmpeg, Windows, 冷知识 最小化远程桌面会中断ffmpeg的录制 我觉得这个应该算冷知识吧。 前情提要 远程桌面连接至虚拟机&#xff0c;并通过ffmpeg录屏 这里可能不太好理解。 我在用…...

12nm工艺,2.5GHz频率,低功耗Cortex-A72处理器培训

“ 12nm工艺&#xff0c;2.5GHz频率&#xff0c;低功耗Cortex-A72处理器培训” 本项目是真实项目实战培训&#xff0c;低功耗UPF设计&#xff0c;后端参数如下&#xff1a; 工艺&#xff1a;12nm 频率&#xff1a;2.5GHz 资源&#xff1a;2000_0000 instances 为了满足更多…...

网络编程套接字(2)

UDP数据报套接字编程 API介绍 DatagramSocket DatagramSocket是UDP的Socket,用于发送和接收数据报. 操作系统中有一类文件,就叫做socket文件(普通文件/目录文件:在硬盘上的) socket文件:抽象的表示了网卡这样的硬件设备 DatagramSocket就是对socket文件进行读写,也就是借助网…...

Elasticsearch:入门(二)

九. Elasticsearch的映射和分析 Elasticsearch的强大搜索引擎功能不仅源于其高效的分布式架构&#xff0c;还在于对数据的映射和分析的深度支持。通过合理的字段类型定义和灵活的分析器配置&#xff0c;可以使搜索更加精准、快速&#xff0c;并满足不同业务场景的需求。 9.1 …...

Debezium日常分享系列之:Debezium 2.6.0.Alpha1发布

Debezium日常分享系列之&#xff1a;Debezium 2.6.0.Alpha1发布 一、重大改变1.MongoDB2.重新选择列后处理器 二、改进和变化1.添加了新的匹配集合 API2.CloudEvents 架构名称自定义3.Oracle Infinispan 缓存改进4.支持 Spanner NEW_ROW_AND_OLD_VALUES 值捕获类型 一、重大改变…...

Phoncent博客,探索Rie Kudan的GPT创作之举

近日&#xff0c;大家都在谈论日本作家Rie Kudan&#xff0c;她凭借其小说《东京共鸣塔》&#xff08;"Tokyo-to Dojo-to"&#xff09;荣获了日本极具声望的芥川奖。这本小说引起了广泛的讨论和思考&#xff0c;因为令人惊讶的是&#xff0c;Kudan在其中直接引用了人…...

力扣hot100 划分字母区间 贪心 思维 满注释版

Problem: 763. 划分字母区间 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 代码随想录 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code class Solution {public List<Integer> partitionLabels(String s){// 创建哈希…...

linux下使用swap分区扩展内存

swap分区是什么&#xff1f; Swap分区是硬盘上的一个特殊区域&#xff0c;被操作系统用作虚拟内存。当系统的物理内存&#xff08;RAM&#xff09;被全部使用时&#xff0c;操作系统会将一部分数据移动到swap分区&#xff0c;以释放RAM上的空间。这个过程被称为"交换&quo…...

实现sleep函数

作用&#xff1a;让线程休眠&#xff0c;等到指定时间在重新唤起。 基于Date实现&#xff1a; 以上的代码不会让线程休眠&#xff0c;而是通过高负荷计算使cpu无暇处理其他任务。缺点是在sleep的过程中其他所有的任务都会被暂停&#xff0c;包括dom的渲染。sleep的过程中程序会…...

汽车销量可视化分析

目录 一.分析的背景、目的、意义 1、背景 2、目的 3、意义 二.数据来源 三.图表分析 1、汽车品牌销量柱状图 2、中国汽车销量柱状图 3、汽车销量前10排行柱状图 4、汽车厂商销量折线图 ​编辑5、汽车销量词云图 6、汽车车型销量 7、汽车价格分布雷达图 8、汽车分…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...