Golang CLI框架介绍

2023-11-15

网址:https://github.com/mitchellh/cli

功能

该框架是个人开发的命令行程序框架,作者还成立了公司(HashiCorp),其公司的产品也采用这个CLI框架。

解读

框架的思路是:把命令和执行方法以map的形式记录在内部,然后根据用户输入的命令,决定执行哪个方法。实际上记录的是命令字符串和CommandFactory,由CommandFactory创建Command然后执行。

框架默认支持version和help两个功能。

示例

下面我们以例子来说明:(为了方便说明,所有的代码都在一个文件里,实际上应该分开多个文件)

package main

import (
	"fmt"
	"os"
	"github.com/mitchellh/cli"
)

func main() {
	c := cli.NewCLI("app", "1.0.0")    //这里指定了APP名字和版本
	c.Args = os.Args[1:]
	c.Commands = map[string]cli.CommandFactory{
		"foo": fooCommandFactory,    //定义foo命令和工厂
		"bar": barCommandFactory,    //定义bar命令和工厂
	}

	exitStatus, err := c.Run()
	if err != nil {
		fmt.Println(err)
	}

	os.Exit(exitStatus)
}

//foo命令工厂
func fooCommandFactory() (cli.Command, error) {
	fmt.Println("I am foo command")
	return new(FooCommand), nil
}
//bar命令工厂
func barCommandFactory() (cli.Command, error) {
	fmt.Println("I am bar command")
	return new(BarCommand), nil
}
//foo命令实现
type FooCommand struct{}

// Help should return long-form help text that includes the command-line
// usage, a brief few sentences explaining the function of the command,
// and the complete list of flags the command accepts.
func (f *FooCommand) Help() string {
	return "help foo"
}

// Run should run the actual command with the given CLI instance and
// command-line arguments. It should return the exit status when it is
// finished.
//
// There are a handful of special exit codes this can return documented
// above that change behavior.
func (f *FooCommand) Run(args []string) int {
	fmt.Println("Foo Command is running")
	return 1
}

// Synopsis should return a one-line, short synopsis of the command.
// This should be less than 50 characters ideally.
func (f *FooCommand) Synopsis() string {
	return "foo command Synopsis"
}

//bar命令实现
type BarCommand struct{}

// Help should return long-form help text that includes the command-line
// usage, a brief few sentences explaining the function of the command,
// and the complete list of flags the command accepts.
func (b *BarCommand) Help() string {
	return "help bar"
}

// Run should run the actual command with the given CLI instance and
// command-line arguments. It should return the exit status when it is
// finished.
//
// There are a handful of special exit codes this can return documented
// above that change behavior.
func (b *BarCommand) Run(args []string) int {
	fmt.Println("bar Command is running")
	return 1
}

// Synopsis should return a one-line, short synopsis of the command.
// This should be less than 50 characters ideally.
func (b *BarCommand) Synopsis() string {
	return "bar command Synopsis"
}

运行go build编译,然后运行,就可以看到执行结果:

name@mypc MINGW64 /d/go-repo/test
$ go build cli1

name@mypc MINGW64 /d/go-repo/test
$ ll
total 3924
-rwxr-xr-x 1 name 197121 4017152 2月  21 09:47 cli1.exe*
drwxr-xr-x 1 name 197121       0 2月  18 14:19 src/

name@mypc MINGW64 /d/go-repo/test
$ ./cli1
I am bar command
I am foo command
I am bar command
I am foo command
Usage: app [--version] [--help] <command> [<args>]

Available commands are:
    bar    bar command Synopsis
    foo    foo command Synopsis


name@mypc MINGW64 /d/go-repo/test
$ ./cli1 foo
I am bar command
I am foo command
I am foo command
Foo Command is running


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

Golang CLI框架介绍 的相关文章

  • 如何从 golang fyne 容器中删除对象

    我正在开发 GUI 应用程序 需要动态添加和删除 gui 元素 我想知道是否有办法从 golang fyne 容器中删除元素 在下面的示例代码中 我创建了容器并动态添加元素 现在我希望能够删除这些元素而不是隐藏它们 我尝试的一个 解决方案
  • 记录 http.ResponseWriter 内容

    Premise 我发现了类似的问题 但不适用于我的情况 因此请不要将其标记为重复 我在 Go 中有一个 HTTP 服务器 并且创建了一个中间件记录请求 响应时间 我也想记录响应 我用过httputil DumpRequest在一个名为的函数
  • 是否可以在 Golang 中 pickle 结构实例

    我正在 Golang 中做一些机器学习 我现在碰壁了 我训练有素的分类器需要将近半分钟的时间来训练 并且想要保存分类器的该实例 这样我就不必每次都从头开始训练 在 Golang 中应该如何去做呢 仅供参考 我的分类器是一个结构 当我用 py
  • 在 Go 中,如何将函数的 stdout 捕获到字符串中?

    例如 在 Python 中 我可以执行以下操作 realout sys stdout sys stdout StringIO StringIO some function prints to stdout get captured in t
  • K8s更改配置映射并更新应用程序日志级别

    我想更改在 K8S 上运行的 Golang 应用程序的登录配置 我在本地尝试了以下代码 它按预期工作 我正在使用 viper 来监视配置文件更改 这是带有日志配置的配置图 apiVersion v1 kind ConfigMap data
  • golang sql 驱动程序的准备语句

    关于golang的sql driver 下面两条语句有什么区别 store DB is sql DB type rows err store DB Query SQL args err nil defer rows Close and st
  • Bash脚本无法执行Go命令

    我正在尝试编写一个 bash 脚本来自动在不同的目录中运行 go get install 相关部分在这里 cd web go get cd web go install cd services go get cd services go i
  • Google App Engine Golang 没有这样的文件或目录

    我正在用 Go 开发一个 Google App Engine 项目 并陷入了读取文件的困境 事实上 应用程序在本地运行得很好 然而 部署时 它会恐慌告诉我没有这样的文件或目录 这是我的 fileValue 方法 func fileValue
  • 数据库连接最佳实践

    我有一个使用 net http 的应用程序 我使用 http 注册了一些处理程序 这些处理程序需要从数据库中获取一些内容 然后才能继续编写响应并完成请求 我的问题是连接到该数据库的最佳实践是什么 我希望它能够以每分钟 1 个请求或每秒 10
  • GoLang - 坚持使用 ISO-8859-1 字符集

    我正在开发一个项目 我们需要将信息保存在具有 ISO 8859 1 表的旧数据库中 因此 在向数据库写入内容之前 我需要将其从 UTF 8 转换为 ISO 8859 1 每次从数据库检索它时 我都需要将其转换回 UTF 8 我试图使用图书馆
  • vscode 中的调试不会在断点处停止,调试器启动时显示“无法找到文件...”

    乌班图 vscode 1 62 1 去1 17 3 vscode go 扩展 v0 29 0 深入研究 v1 7 1 我是 vscode 和 Go 的新手 我有多年在 Eclipse 中调试 Java 应用程序的经验 我构建了一个小型多模块
  • 给定方法值,获取接收者对象

    Go 有没有办法从方法值获取接收者对象 例如有没有这样的MagicFunc这将使以下程序输出字符串my info来自底层 Foo 实例 package main import fmt type Foo struct A string fun
  • 共享来自单独命令/进程的属性

    我提供带有多个命令和子命令的命令行工具 我使用cobra https github com spf13 cobra命令行 我有两个单独的命令首先是前提条件e 给其他人 例如第一个命令是通过创建临时文件夹并验证某些文件来首选环境 第二个命令应
  • 按引用或按值扫描功能

    我有以下代码 statement SELECT id from source where mgmt 1 var exists string errUnique dr db QueryRow statement mgmt Scan exist
  • Golang 基础知识 struct 和 new() 关键字

    我正在学习 golang 当我阅读描述结构的章节时 我遇到了初始化结构的不同方法 p1 passport var p2 passport p3 passport Photo make byte 0 0 Name Scott Surname
  • 投射回更专业的界面

    我正在用 Go 编写一个游戏 在 C 中 我将所有实体类存储在 BaseEntity 类的数组中 如果一个实体需要在世界中移动 那么它将是一个从 BaseEntity 派生的 PhysEntity 但添加了方法 我尝试模仿这是 go pac
  • 在处理程序之后访问 HTTP 请求上下文

    在我的日志记录中间件 链中的第一个 中 我需要访问一些在链下游的某些身份验证中间件中编写的上下文 并且仅在处理程序本身执行之后 旁注 需要首先调用日志记录中间件 因为我需要记录请求的持续时间 包括在中间件中花费的时间 此外 当权限不足时 身
  • 在 Go 中使用电子邮件地址创建证书签名请求 (CSR)

    我尝试使用 crypto x509 包生成 CSR 但没有找到将 emailAddress 字段添加到其主题中的方法 根据文档证书申请 http golang org pkg crypto x509 CertificateRequest结构
  • Gorm 总是返回带有 nil 值的结构

    我正在使用 Gorm 构建 Go Web API 作为 Amazon RDS 中 Postgresql 数据库的 ORM 问题是 Gorm 总是返回一片结构 其值全部为零 尽管数据库已经填充了数据 切片中的结构体数量是否合适取决于LIMIT
  • 我应该避免在 golang 中使用单例包吗?

    现在我有一个包裹store包含以下内容 package store var db Database func Open url string error open db connection func FindAll model inter

随机推荐

  • Diffusion Model原理详解及源码解析

    作者简介 秃头小苏 致力于用最通俗的语言描述问题 专栏推荐 深度学习网络原理与实战 近期目标 写好专栏的每一篇文章 支持小苏 点赞 收藏 留言 文章目录 Diffusion Model原理详解及源码解析 写在前面 Diffusion Mod
  • Spring Boot 实现多文件上传

    文件上传 Spring Boot代码 代码结构 Controller层 package com yqifei upload controller import io swagger annotations Api import org sp
  • php结合swoole 如何对接ChatGPT接口

    对接ChatGPT接口需要进行以下步骤 安装Swoole扩展和PHP cURL扩展 在项目中引入 composer require guzzlehttp guzzle 来安装 Guzzle HTTP客户端 编写HTTP请求代码调用ChatG
  • 面向对象的三大特性:继承、多态、封装--封装

    一 封装 1 广义的封装 实例化一个对象 给对象空间封装一些属性 class A def init self name selef name name 对象封装属性 2 狭义的封装 私有制 私有成员 私有静态字段 私有动态方法 私有对象 私
  • Basic Level 1078 字符串压缩与解压 (20分)

    题目 文本压缩有很多种方法 这里我们只考虑最简单的一种 把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示 例如 ccccc 就用 5c 来表示 如果字符没有重复 就原样输出 例如 aba 压缩后仍然是 aba 解压
  • GDB中应该知道的几个调试方法

    七 八年前写过一篇 用GDB调试程序 于是 从那以后 很多朋友在MSN上以及给我发邮件询问我关于GDB的问题 一直到今天 还有人在问GDB的相关问题 这么多年来 有一些问题是大家反复在问的 一方面 我觉得我以前的文章可能没有说清楚 另一方面
  • .bat 文件是什么?做什么用的?

    一 bat文件是dos下的批处理文件 批处理文件是无格式的文本文件 它包含一条或多条命令 它的文件扩展名为 bat 或 cmd 在命令提示下输入批处理文件的名称 或者双击该批处理文件 系统就会调用cmd exe按照该文件中各个命令出现的顺序
  • 近年来,学习图像去雾不得不看的论文和源代码

    S G Narasimhan and S K Nayar 多幅图像 同一场景不同时间 天气 去雾 主页 NASA Retinex理论增强 主页 Ana Bel n Petro总结了NASA的Retinex理论 源代码 不过不是matlab版
  • HDU--1050:Moving Tables (贪心)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1050 2 解题思路 将每个输入的起始房间和结束房间转换为房间前面的区间 按区间起始位置从小到大排序 首先取第一个区间 后续如果有区间的起始位
  • 计算机网络-第一章 计算机网络体系结构(详细知识点总结)

    目录 第一章 计算机网络体系结构 大纲 1 1 计算机网络概述 1 1 1 计算机网络的概念 1 1 2 计算机网络的组成 1 1 3 计算机网络的功能 1 1 4 计算机网络的分类 1 1 5 计算机网路的标准化工作及相关组织 1 1 6
  • 编译mediastreamer2/ffmpeg/linphone(x86平台)

    在x86环境下编译mediastreamer2的步骤 1 编译OGG库 音频编解码 http www xiph org downloads configure prefix usr disable static 2 编译SPEEX 音频编解
  • java对象比较器_具有多个字段的对象的Java比较器

    我有Collection5个字段的对象 id entityType entityId brandId productId 要排序的ArrayList的Collection我写了下面Comparaor Comparator collectio
  • uint是什么数据类型_「IEC 61131-3」标准数据类型

    IEC 61131 3定义的标准数据类型有 布尔型 整型 浮点型 字符串型 时间日期类型和常数 以下将逐一介绍各种数据类型 布尔型 布尔变量可取值TRUE和FALSE 占8位内存空间 布尔型变量声明示例 bExec BOOL FALSE b
  • 无法启动此程序,因为计算机中丢失QT5Core.dll

    背景 QT项目从QTCreator移植到VS2010中时出现这个问题 原因 在Qt Creator中运行时会根据你当前选择的构建套件生成一套自己的环境变量 这套环境变量与当前电脑的环境变量的差别是添加了Qt库的引用路径 所以在Creator
  • 取余运算的规则

    取余运算满足以下规则 x y p x p y p p 证明如下 假设 x a p b y c p d 则 x p b y p d 则 x y p a p b c p d p a c p b d p b d p x p y p p
  • JAVASE总复习

    一 填空题 共 20 个题目 总计 20 分 1 Java application 中的主类需要包含 main 方法 main 方法的返回类型是void 2 移位运算符可以起到对操作数乘以 2 或者除以 2 的作用 那么操作数除以 2 的移
  • shader练习中遇到的问题点

    half3 lrDirWS normalize reflect lDirWS nDirWS 不加normalize会有白点点 1 max 0 ndotv 模型上会出现黑点点 max 0 1 ndotv 模型上不会出现黑点点
  • Spirng的事务 方法A调用方法B,事务是否失效

    Springboot开启了事务的方法调用没有事务的方法 提示 上方标题是一个很笼统的场景 详情展开如下 先说结论 总结 方法A调用方法B 场景一 如果A和B方法在同一个类中 如果A加 Transactional注解 B加不加 Transac
  • 看完这篇 教你玩转渗透测试靶机vulnhub——FunBox1

    Vulnhub靶机FunBox1渗透测试详解 Vulnhub靶机介绍 Vulnhub靶机下载 Vulnhub靶机安装 Vulnhub靶机漏洞详解 信息收集 暴力破解 ssh登入 提权 获取flag Vulnhub靶机渗透总结 Vulnhub
  • Golang CLI框架介绍

    网址 https github com mitchellh cli 功能 该框架是个人开发的命令行程序框架 作者还成立了公司 HashiCorp 其公司的产品也采用这个CLI框架 解读 框架的思路是 把命令和执行方法以map的形式记录在内部