带你使用Golang快速构建出命令行应用程序

2023-11-20

在日常开发中,大家对命令行工具(CLI)想必特别熟悉了,如果说你不知道命令工具,那你可能是个假开发。每天都会使用大量的命令行工具,例如最常用的Git、Go、Docker等。

不管是做技术开发还是业务开发,都会有开发命令行程序的场景。例如如果是开发框架,会开发一个命令行工具帮助使用者快速生成项目结构;如果是开发一个定时任务程序,会开发一个命令行工具来启动这个任务。本文就介绍两个专门用来开发命令行应用程序的库。

urfave/cli

urfave/cli是一个简单、快速、有趣的包,专门用于构建命令行应用程序。其目标是使开发人员能够以一种富有表现力的方式编写快速且可分发的命令行应用程序。看一个简单的例子:

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/urfave/cli/v2"
)

funcmain() {
	app := &cli.App{
		Name:  "blog",
		Usage: "显示路多辛blog欢迎语",
		Action: func(*cli.Context)error {
			fmt.Println("欢迎来到路多辛的blog,能帮助到大家是我最大的快乐!")
			returnnil
		},
	}

	if err := app.Run(os.Args); err != nil {
		log.Fatal(err)
	}
}

编译后,执行一下查看帮助命令看下效果

$ ./main -h 
NAME:
   blog - 显示路多辛blog欢迎语

USAGE:
   blog [global options] command [command options] [arguments...]

COMMANDS:
   help, h  Shows a list of commands or helpfor one command

GLOBAL OPTIONS:
   --help, -h  show help

执行下blog命令看下效果

$ ./main blog
欢迎来到路多辛的blog,能帮助到大家是我最大的快乐!

更多使用方法可以参考官方文档 https://cli.urfave.org/

spf13/cobra

这个库是Go语言负责人主要参与开发的,很多知名项目的命令行工具都是使用这个库开发的,例如Kubernetes、Istio、Docker、Etcd、GitHubCLI等等。看一个简单的例子:

package main

import (
	"fmt"
	"os"

	"github.com/spf13/cobra"
)

funcmain() {
	Execute()
}

funcExecute() {
	var rootCmd = &cobra.Command{
		Use:   "blog",
		Short: "显示路多辛blog欢迎语",
		Long:  "显示路多辛blog欢迎语,介绍blog的整体情况",
		Run: func(cmd *cobra.Command, args []string) {
			fmt.Println("欢迎来到路多辛的blog,能帮助到大家是我最大的快乐!")
		},
	}
	if err := rootCmd.Execute(); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
}

编译后,执行一下查看帮助命令看下效果:

$./main -h       显示路多辛blog欢迎语,介绍blog的整体情况Usage:blog[flags]Flags:-h,--help   help for blog

执行下blog命令看下效果:

$ ./main blog
欢迎来到路多辛的blog,能帮助到大家是我最大的快乐!

更多使用方法可以参考官方文档

https://github.com/spf13/cobra/blob/main/user_guide.md

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

带你使用Golang快速构建出命令行应用程序 的相关文章

随机推荐

  • 剑指Offer(牛客网)-数据流中的中位数

    题目来源 https www nowcoder com practice 9be0172896bd43948f8a32fb954e1be1 tpId 13 tqId 11216 tPage 4 rp 4 ru ta coding inter
  • 内网DNS域名解析 dnsmasq搭建

    此片文章为DNS内网解析部署文档 简单实用 解决企业内部web服务IP地址访问问题 企业内部如果不启用域名DNS服务 服务器就只能通过IP进行访问了 除了传统的bind解决方案 推荐一个新的DNS解决方案 dnsmasq dnsmasq 用
  • springboot邮件发送 端口587/465不同配置

    Spring Boot教程 26 如何发送邮件 知乎 大体上来说 发送的方式有两种 一种是使用SMTP协议 连上SMTP服务器发送邮件 一种是使用第三方的邮件发送服务 调调API就行 我们先来说说前者 SMTP是 简单邮件传输协议 的简称
  • 杰里之ENC降噪】【篇】

    对于TWS耳机 比起ANC功能 通话降噪才是真正的刚需 主动降噪 ANC 通话降噪 ENC ENC Environment Noise Cancellation 环境噪音消除 的实现方法多种多样 ENC与ANC ANC Active noi
  • BFP 过滤规则

    设置过滤规则就是让网络设备只是捕获我们感兴趣的网络数据包 如果没有设置过滤规则 即上面的 filter app 是空字符串 那么网络设备就捕获所有类型的数据包 否则只是捕获过滤规则设置的数据包 此时过滤规则的逻辑值为真 此过滤规则是通用的
  • 交换机与路由器工作原理

    前言 这篇博客的主要目的是为了聊一下路由器和交换机 以及它们各自的工作原理和对应的两张表 交换机 1 简单介绍交换机 这里的交换机主要讲的是 二层交换机 它工作在OSI七层模型中的第二层 也就是数据链路层 因此就不得不说一下数据链路层的功能
  • 梯度提升树(GBDT)原理和超参数调节小结

    GBDT原理 GBDT超参数调节 以上都出自刘建平老师的博客 刘老师的博客对机器学习算法的总结很细致全面 值得学习
  • 关于obsidian和typora之间格式无法兼容的解决(图片显示问题)

    要在obsidian中进行如下设置 也就是将每个markdown文件中的图片都放在该markdown文件所在的文件夹中 然后图片的格式是通用markdown的格式 路径是基于该文件的相对路径 使用时 每个文件都单独创建一个文件夹来放置 然后
  • 【超级无敌详细的韩顺平java笔记】从入门到精通---配置patth

    JVM 是一个虚拟的计算机 具有指令集并使用不同的存储区域 负责执行指令 管理数据 内存 寄存器 包含在 JDK 中 java文件 源文件 class文件 字节码文件 目录 一 编译 二 运行 三 JDK JRE 和 JVM 的包含关系 四
  • 瑞吉外卖项目实战

    目录 一 软件开放流程 二 瑞吉外卖项目概述 三 开发环境搭建 1 数据库环境的搭建 一 启动Navicat 二 数据库设计 三 创建数据库 四 导入数据库脚本 五 查看数据库中的表 四 Maven项目搭建 一 创建Maven项目 二 检查
  • 基于Springboot搭建java项目(十五)——RabbitMq的确认机制和延时通知

    RabbitMq的确认机制和延时通知 一 消息发送确认 在RabbitConfig中两个回调函数 一个叫 ConfirmCallback 一个叫 RetrunCallback 1 交换机确认 ConfirmCallback方法 Confir
  • R包实践:lubridate 处理时间数据

    人生有一道难题 那就是如何使一寸光阴等于一寸生命 在数据分析中也有一道难题 那就是如何自如的操作时间数据 R语言的基础包中提供了两种类型的时间数据 一类是Date日期数据 它不包括时间和时区信息 另一类是POSIXct POSIXlt类型数
  • Java实现MD5加密及解密的代码实例

    础 MessageDigest类的使用 其实要在Java中完成MD5加密 MessageDigest类大部分都帮你实现好了 几行代码足矣 对字符串md5加密 param str return import java security Mes
  • DevExpress设置单元格不可编辑,选单元格则选中一行

    DevExpress设置单元格不可编辑 选单元格则选中一行 目的是只展示数据 不提供修改功能 DevexpressGridControl禁止点击单元格修改 设置GridView OptionsBehavior的Editable选项设为Fal
  • JAVA多线程实现-单线程化线程池newSingleThreadExecutor

    JAVA通过Executors提供了四种线程池 单线程化线程池 newSingleThreadExecutor 可控最大并发数线程池 newFixedThreadPool 可回收缓存线程池 newCachedThreadPool 支持定时与
  • char类型数据的取值范围如何确定

    char类型数据是计算机编程语言中只可容纳单个字符的一种基本数据类型 取值范围为 128 127 对于上述概念相信大家都已经很熟悉了 但仍有不少同学对于char类型数据的取值范围抱有疑问 不知道为什么char类型数据的取值范围如何确定 若要
  • 浮点数是否与零相等的判断方法

    1 如何判断单精度浮点数 float a是否等于零 if fabs a lt 1e 6 如果成立 则a等于0 2 如何判断双精度浮点数 double a是否等于零 if fabs a lt 1e 15 如果成立 则a等于0 3 如何判断两个
  • Vue传递数据到后台SpringMVC接收解析返回

    最近在自学vue 开始以为跟angular大同小异 但是真正使用的时候发现还是很多不一样的地方 可能是因为刚刚开始理解的还不够深入O O 下面说说前端jsp怎么和后台交互 后台使用的是springMvc框架 html部分 div table
  • python算法中的机器学习算法之无监督学习知识点(详解)

    目录 学习目标 学习内容 K均值聚类 K Means Clustering 层次聚类 Hierarchical Clustering
  • 带你使用Golang快速构建出命令行应用程序

    在日常开发中 大家对命令行工具 CLI 想必特别熟悉了 如果说你不知道命令工具 那你可能是个假开发 每天都会使用大量的命令行工具 例如最常用的Git Go Docker等 不管是做技术开发还是业务开发 都会有开发命令行程序的场景 例如如果是