在Go里面应用中flag这一标准库,提供了很多我们在写命令行时需要的interface,然而如果你需要更强大更好的结构,可以试一下cli.go这个库。

利用cli.go来写命令行应用

定义命令和子命令

下面是一个例子:

package main

import (
"fmt"
"os" "github.com/codegangsta/cli"
) func main() {
app := cli.NewApp()
app.Name = "jasperapp"
app.Usage = "sample command-line app by jasper"
app.Author = "Carter"
app.Email = "jasper@xxx.com"
app.Commands = []cli.Command{
{
Name: "read",
ShortName: "r",
Usage: "read something",
Subcommands: []cli.Command{
{
Name: "articles",
Usage: "read articles",
Action: readArticles,
},
{
Name: "tweets",
Usage: "read Tweets",
Action: readTweets,
},
},
},
}
app.Run(os.Args)
} func readArticles(ctx *cli.Context) {
fmt.Println("Go to http://www.opscoder.info to read articles!")
} func readTweets(ctx *cli.Context) {
fmt.Println("Go to http://www.opscoder.info to read our tweets!")
}

如果你不带参数去运行,你将会得到下面的帮助信息:

NAME:
jasperapp - sample command-line app by jasper USAGE:
jasperapp [global options] command [command options] [arguments...] VERSION:
0.0.0 AUTHOR:
Carter - <jasper@xxx.com> COMMANDS:
read, r read something
help, h Shows a list of commands or help for one command GLOBAL OPTIONS:
--help, -h show help
--version, -v print the version

我们定义一个read子命令,它有articlestweet两个命令:

jasperapp read articles

输出为:

Go to http://www.opscoder.info to read articles!

或是运行:

jasperapp read tweets

输出为:

Go to http://www.opscoder.info to read our tweets!

使用context

每个动作都有一个context,在下面的例子中函数readArticles和readTweets接收一个参数,我们可以这样使用:

func readArticles(ctx *cli.Context) {
fmt.Printf("The first argument was: %s", ctx.Args().First())
}

现在运行jasperapp read articles please将会输出:

The first argument was: please

使用flags

为了展示flags的用法,我们稍微修改一下tweets子命令:

{
Name: "tweets",
Usage: "read Tweets",
Flags: []cli.Flag{
cli.StringFlag{
Name: "account",
Value: "TheJasper",
Usage: "name of Twitter account",
},
},
Action: readTwitter,
},

其中readTweets函数这么写:

func readTwitter(ctx *cli.Context) {
fmt.Printf("Go to http://www.opscoder.info/%s to read tweets!", ctx.String("account"))
}

现在让我们编译结果并查看下tweets子命令的帮助信息:

jasperapp read tweets --help

输出如下:

NAME:
tweets - read Tweets USAGE:
command tweets [command options] [arguments...] OPTIONS:
--account 'TheJasper' name of Twitter account

现在让我们试试:

$ jasperapp read tweets
Go to http://www.opscoder.info/TheJasper to read tweets! $ jasperapp read tweets --account codegangsta
Go to http://www.opscoder.info/codegangsta to read tweets!

总结

Cli.go还有很多自定义的东西,具体可以参考Godoc的文档

使用Cli构建Go的命令行应用的更多相关文章

  1. CLI:使用Go开发命令行应用

      原文地址 CLI或者"command line interface"是用户在命令行下交互的程序.由于通过将程序编译到一个静态文件中来减少依赖,一次Go特别适合开发CLI程序.如 ...

  2. php cli模式学习(PHP命令行模式)

    http://www.jb51.net/article/37796.htm php_cli模式简介  php-cli是php Command Line Interface的简称,如同它名字的意思,就是 ...

  3. php在cli模式下取得命令行中的参数的方法-getopt命令行可传递数组-简单自定义方法取命令行参数

    在cli模式下执行PHP时,自动给脚本文件传递了一个变量$argv,其值即是一个命令中所有值组成的数组(以空格区分),在PHP程序中接收参数有3种方法1.直接使用argv变量数组. 2.使用$_SER ...

  4. Azure CLI 2.0-Azure新命令行工具介绍

    Azure CLI 2.0 是 Azure 的新命令行体验,用于管理 Azure 资源. 可以将其安装在 macOS.Linux 和 Windows 上,然后从命令行运行它. Azure CLI 2. ...

  5. 4 个用于构建优秀的命令行用户界面的 Python 库

    作者: Amjith Ramanujam 译者: LCTT Lv Feng 在这个分为两篇的关于具有绝佳命令行界面的终端程序的系列文章的第二篇教程中,我们将讨论 Prompt.Toolkit.Clic ...

  6. 构建一个Flowable命令行应用

    官网链接 [(https://flowable.com/open-source/docs/bpmn/ch02-GettingStarted/#building-a-command-line-appli ...

  7. C++/cli中swtich处理命令行接收到的关键字

    QQ群友中有人提出这样一个问题: Swtich接受的是整形或枚举类型, 关键字多数是一个字符, 将string转换成char就应该可以, 所以我试着写了一下代码, 直接提取string的第一个字符, ...

  8. Apache Commons CLI命令行启动

    今天又看了下Hangout的源码,一般来说一个开源项目有好几种启动方式--比如可以从命令行启动,也可以从web端启动.今天就看看如何设计命令行启动... Apache Commons CLI Apac ...

  9. golang常用库:cli命令行/应用程序生成工具-cobra使用

    golang常用库:cli命令行/应用程序生成工具-cobra使用 一.Cobra 介绍 我前面有一篇文章介绍了配置文件解析库 Viper 的使用,这篇介绍 Cobra 的使用,你猜的没错,这 2 个 ...

随机推荐

  1. CCM和GCM

    分组密码链接-消息认证码--CCM    Counter with CBC-MAC 组成CCM的关键算法是AES加密算法.CTR工作模式和CMAC认证算法,在加密和MAC算法中共用一个密钥K. CCM ...

  2. Java五道输出易错题解析(进来挑战下)

    转自:http://blog.csdn.net/lanxuezaipiao/article/details/41985243 收集了几个易错的或好玩的Java输出题,分享给大家,以后在编程学习中稍微注 ...

  3. 听说你又一次放弃了Dagger2,来听老夫说道说道

    关于Dagger2是啥,用法网上已经有很多了.不过听说你已经很多次Dagger2从入门到放弃了,来来,让我这个老中医给你治一治.老夫手法纯熟,不会让你有任何痛苦的,放心读下去吧. 本文同步自 博主的私 ...

  4. MyBatis主键生成器SelectKeyGenerator(三)

    前面两篇博客我们介绍了MyBatis主键生成器KeyGenerator(一)和MyBatis主键生成器Jdbc3KeyGenerator(二),接下来我们介绍SelectKeyGenerator, 如 ...

  5. cas 单点登录(SSO)实验之二: cas-client

    cas 单点登录(SSO)实验之二: cas-client 参考文章: http://my.oschina.net/indestiny/blog/200768#comments http://wenk ...

  6. unity使用UGUI创建摇杆

    1.现在unity做一个项目,各种插件各种包,于是项目资源就无限变大了,其实一些简单的功能可以自己写,这里就是试着使用UGUI编写一个摇杆功能 2.脚本如下: using UnityEngine; u ...

  7. Ubuntu快速截图

    以前截图,都是按Print键全屏截图,Alt+Print可以截当前的窗口.同时把系统自带的截图工具放到面板上,用的时候点击一下,再选择区域截图,很是不方便.不过,Ubuntu允许自己定义快捷键.要自己 ...

  8. Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

    Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇 ...

  9. 【Qt编程】Qt学习之状态栏

    QStatusBar类提供一个水平条来显示状态信息.所谓状态信息,拿个简单的例子来说,当你在word中编辑时,左下角就会出现页面.字数等等信息.状态信息可以分为三类:临时信息,如一般的提示信息:正常信 ...

  10. Android调试工具之ADB

    Android调试工具之ADB 1.     什么是ADB adb的全称为Android Debug Bridge,顾名思义,这个是PC机与Android设备的连接桥.简单的说,就是通过adb ,PC ...