创建一个命令行程序

问题

如何使用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. .NET 纯原生实现 Cron 定时任务执行,未依赖第三方组件 (Timer 优化版)

    在上个月写过一篇 .NET 纯原生实现 Cron 定时任务执行,未依赖第三方组件 的文章,当时 CronSchedule 的实现是使用了,每个服务都独立进入到一个 while 循环中,进行定期扫描是否 ...

  2. centos7部署k8s(1master1node)

    〇.前言 就想多学学罢了 准备环境: centos7 master 8GB 172.26.130.204 centos7 node 8GB 172.26.130.205 yum源就阿里源就好... 一 ...

  3. Java 多线程:锁(三)

    Java 多线程:锁(三) 作者:Grey 原文地址: 博客园:Java 多线程:锁(三) CSDN:Java 多线程:锁(三) StampedLock StampedLock其实是对读写锁的一种改进 ...

  4. MySQL 中的锁机制

    介绍锁机制 技术是为了解决问题而生的,锁被用来实现隔离性,保证并发事务的正确性. 两段锁 & 一次封锁 两段锁 数据库遵循的是两段锁协议,将事务分成两个阶段,加锁阶段和解锁阶段(所以叫两段锁) ...

  5. Windows SMTP服务器的中继列表

    今天在一台Windows 2019的SMTP服务器上想增加一个匿名中继的客户端地址.登录到服务器后发现原来的设置丢失了,而且原来的允许列表也不见了.界面变成了这样. https://www.cnblo ...

  6. 关于在PyCharm中使用虚拟环境

    Python虚拟环境的概念对于管理项目用到的第三方包真是好处多多,所以也想在PyCharm使用虚拟环境. 在这个过程中,遇到很多问题: 第一是使用Python创建虚拟环境,然后在PyCharm创建项目 ...

  7. 彻底掌握Makefile(二)

    彻底掌握Makefile(二) 前言 在前面的文章彻底掌握Makefile(一)当中,我们简要的介绍了一些常见的makefile使用方法,在本篇文章当中我们将继续介绍一些makefile当中的常见用法 ...

  8. Java SE 16 record 类型说明与使用

    Java SE 16 record 类型说明与使用 作者:Grey 原文地址: 博客园:Java SE 16 record 类型说明与使用 CSDN:Java SE 16 record 类型说明与使用 ...

  9. 使用 Elastic 技术栈构建 K8S 全栈监控 -3: 使用 Filebeat 采集 Kubernetes 集群日志

    文章转载自:https://www.qikqiak.com/post/k8s-monitor-use-elastic-stack-3/ 操作步骤 filebeat连接es使用上一步创建的secret: ...

  10. CentOS系统一键部署jdk,maven,tomcat,mysql

    #!/bin/bash ####使用方法############### # chmod a+x JdTomK-Auto.sh # source JdTomK-Auto.sh ############# ...