创建一个命令行程序

问题

如何使用golang创建可以在命令行当中传递参数的程序?go如何带参数执行程序?

比如我们期望使用hello -version来查看hello程序的版本号码。或者输入hello language chinese 来切换hello程序的语言版本。

解决

在网络上大家可以经常搜索到的解决方案是使用go标准库当中的os.Args或者flag方法获取命令行参数再执行程序。可以很容易google和baidu的这里就不重复说明了。

这里介绍一个开源的cli库的解决方案。

urfave/cli

该cli库集成了很多创建cli程序的工具和方法,官方github库文档功能案例介绍比较全面很容易学习使用。

截止到2018年2月19日,该开源库有875次commit,33次releases,7462个star。经过长期迭代和社区验证功能比较完整,程序稳定性也相对会可靠很多。

实现查看版本和切换语言的程序功能

注:本案例代码只是简单的打印出language而已。

package main

import (
"os"
"github.com/urfave/cli"
"fmt"
) func main() {
//实例化cli
app := cli.NewApp()
//Name可以设定应用的名字
app.Name = "hello"
// Version可以设定应用的版本号
app.Version = "1.0.0"
// Commands用于创建命令
app.Commands = []cli.Command{
{
// 命令的名字
Name: "language",
// 命令的缩写,就是不输入language只输入lang也可以调用命令
Aliases: []string{"lang"},
// 命令的用法注释,这里会在输入 程序名 -help的时候显示命令的使用方法
Usage: "change language",
// 命令的处理函数
Action: func(c *cli.Context) error {
language := c.Args().First()
if language == "chinese"{
fmt.Println("Language is 中文")
}else {
fmt.Println("Language is English")
}
return nil
},
}, }
// 接受os.Args启动程序
app.Run(os.Args)
}

效果

liuMacBook-Pro:gowork liuyunpeng$ go run hello.go -help
NAME:
hello - A new cli application USAGE:
hello [global options] command [command options] [arguments...] VERSION:
1.0.0 COMMANDS:
language, lang change language
help, h Shows a list of commands or help for one command GLOBAL OPTIONS:
--help, -h show help
--version, -v print the version liuMacBook-Pro:gowork liuyunpeng$ go run hello.go -version
hello version 1.0.0
liuMacBook-Pro:gowork liuyunpeng$ go run hello.go lang chinese
Language is 中文
liuMacBook-Pro:gowork liuyunpeng$ go run hello.go lang french
Language is English
liuyMacBook-Pro:gowork liuyunpeng$ go run hello.go lang english
Language is English

更多的使用方法可以登录urfave/cli查看。

扩展

1.命令行的形式

值得大家注意的是,-flag 前面带减号(实际上应该是破折号为了方便就缩减成减号了)这种带标志方式的使用方法和 command 方法是两个概念。个人理解是前者代表参数的传递比如给 -name=ppmoon 就是给name变量传递ppmoon参数。后者是执行一段命令,比如 hello add 1 1 返回结果就是2,就是通过hello程序执行了一个1+1的运算,参数通过空格的方式依次传递到程序当中了。从使用体验和角度来说个人认为并没有什么大的区别,因为本质上来说cli程序只是没有图形化的UI界面,我们只是在命令提示符当中操作程序罢了,不管你使用什么样子的方式传递都只是形式上的变化。

2.关于go标准库当中的flag包以及os.Args方法

flag是官方提供的一个不错的cli程序扩展包,里面也包含了很多常用的方法。不管是flag还是urfave/cli都需要依赖OS包当中的os.Args方法来获取命令行参数,这一点是值得注意的便于理解cli程序的原理。

3.设置环境变量在任意文件夹使用cli程序

在Mac Windows Linux我们都会使用到命令行程序,如果想在全局任何一个文件夹下面都使用命令行程序,我们只需要将cli程序的可执行程序文件所在的文件夹路径添加到环境变量里就可以直接使用程序的名字全局调用cli程序了。具体网络上可以搜索到诸多教程这里就不赘述了。

 

作者:ppmoon
链接:https://www.jianshu.com/p/790dc1171bbf
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

go如何编写命令行(cli)程序的更多相关文章

  1. 如何用Node编写命令行工具

    0. 命令行工具 当全局安装模块之后,我们可以在控制台下执行指定的命令来运行操作,如果npm一样.我把这样的模块称之为命令行工具模块(如理解有偏颇,欢迎指正) 1.用Node编写命令行工具 在Node ...

  2. NET Core 环境搭建和命令行CLI入门

    NET Core 环境搭建和命令行CLI入门 2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文 ...

  3. 使用.NET Core快速开发一个较正规的命令行应用程序

    程序员的世界,命令行工具一直是"体验非常友好"的工具,也能自动化完成很多事情,同时还能结合shell来进行某项任务的批处理(脚本).在.NET Core中,命令行应用程序是基础,但 ...

  4. NET Core 环境搭建和命令行CLI入门[转]

      NET Core 环境搭建和命令行CLI入门 时间:2016-07-06 01:48:19      阅读:258      评论:0      收藏:0      [点我收藏+]   标签: N ...

  5. 如何用node编写命令行工具,附上一个ginit示例,并推荐好用的命令行工具

    原文 手把手教你写一个 Node.js CLI 强大的 Node.js 除了能写传统的 Web 应用,其实还有更广泛的用途.微服务.REST API.各种工具……甚至还能开发物联网和桌面应用.Java ...

  6. Android中使用am命令实现在命令行启动程序详解

    在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am. 复制代码代码如下: usage: am [subcommand] [options] start an ...

  7. 使用powershell监控命令行console程序并在停止时启动

    有一种C#命令行console程序,为了能看到console台的输出所以不能做成服务.为了防止这些程序自己死掉,使用powershell监控程序并重启 #利用程序名来进行重启if (!(get-pro ...

  8. 使用.Net Core编写命令行工具(CLI)

    命令行工具(CLI) 命令行工具(CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行. 通常认为,命令行工具(CLI)没有 ...

  9. commanderJs编写命令行工具(cli)

    前言: 最近需要做一个内部的node cli来独立构建流程,对整个命令行工具实现流程有了大致了解,下面来解释一下如何实现一个cli,和如何使用 commander 库.   新手误区: 在开始实现之前 ...

  10. 一个小时学会用 Go 编写命令行工具

    前言 最近因为项目需要写了一段时间的 Go ,相对于 Java 来说语法简单同时又有着一些 Python 之类的语法糖,让人大呼"真香". 但现阶段相对来说还是 Python 写的 ...

随机推荐

  1. C++中的STL大法整理

    C++中的STL大法整理 由于碰到了一些不知道怎么用的STL vector vector是数组的STL,对于普通数组的优势就在于,可以动态地变化数组长度.那么面对一些数据范围非常大而又可以边读入边处理 ...

  2. java的URI和URL的关系

    java的URI和URL到底是什么 在我们做开发时,经常有URI和URL弄混的问题,如果当时直接看URI和URL的源码就不可能弄混.首先我总结一下URI和URL的关系:他们的关系是:URL是一种特殊的 ...

  3. Kibana可视化数据(Visualize)

    在侧边导航栏点击 Visualize 开始视化您的数据. Visualize 工具能让您通过多种方式浏览您的数据.例如:我们使用饼图这个重要的可视化控件来查看银行账户样本数据中的账户余额.点击屏幕中间 ...

  4. kibana安装安装插件

    命令语法:bin/kibana-plugin install <package name or URL> 当您指定的插件名没有带 URL,插件工具将会尝试去下载 Elastic 官方插件. ...

  5. Java SE 19 虚拟线程

    Java SE 19 虚拟线程 作者:Grey 原文地址: 博客园:Java SE 19 虚拟线程 CSDN:Java SE 19 虚拟线程 说明 虚拟线程(Virtual Threads)是在Pro ...

  6. 手把手教你使用LabVIEW人工智能视觉工具包快速实现图像读取与采集(含源码)

    目录 前言 一.工具包位置 二.图像采集与色彩空间转换 1.文件读写 2.实现图片读取 3.使用算子cvtColor实现颜色空间转换 三.从摄像头采集图像 1.Camera类 2.属性节点 3.实现摄 ...

  7. Linux+Proton without Steam玩红警3指南

    首先你需要Proton5.13 without Steam,使用说明和下载链接看这里https://www.cnblogs.com/tubentubentu/p/16716612.html 然后在/e ...

  8. Ubuntu 20.04安装mysql后用mysql root无法登录

    刚安装mysql后,执行 mysql -u root -p 提示无法执行 解决方案: sudo mysql -u root -p 使用root权限不用密码就能进入mysql 然后 >ALTER ...

  9. vue禁用浏览器返回键

    mounted () { // 禁用浏览器返回键 history.pushState(null, null, document.URL); window.addEventListener('popst ...

  10. 关于AWS-IAM-certificate-证书的说明

    AWS提供了证书管理的服务,可以使用IAM和ACM(位于Security & Identity IAM下的Certificate Manager)进行管理 在CloudFront和ALB中都可 ...