创建一个命令行程序

问题

如何使用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. OpenHarmony3.0如何轻松连接华为云IoT设备接入平台?

    摘要:本文主要介绍基于OpenHarmony 3.0版本来对接华为云IoT设备接入IoTDA,以小熊派BearPi-HM_Nano开发板为例,使用huaweicloud_iot_link SDK对接华 ...

  2. C/C++ Capstone 引擎源码编译

    Capstone 是一个轻量级的多平台.多架构的反汇编框架.Capstone 旨在成为安全社区中二进制分析和反汇编的终极反汇编引擎.Capstone的编译非常简单只需要一步即可轻松得到对应的Lib库文 ...

  3. flutter系列之:flutter中常用的ListView layout详解

    目录 简介 ListView详解 ListView中的特有属性 ListView的构造函数 ListView的使用 总结 简介 ListView是包含多个child组件的widget,在ListVie ...

  4. 前端实现docx、pdf格式文件在线预览

    theme: vuepress highlight: atelier-heath-light 介绍 在业务中,如果遇到文档管理类的功能,会出现需要在线预览的业务需求,本文主要是通过第三方库来实现文档预 ...

  5. 了解如何配置Nginx日志

    设置access_log 访问日志主要记录客户端的请求.客户端向Nginx服务器发起的每一次请求都记录在这里.客户端IP,浏览器信息,referer,请求处理时间,请求URL等都可以在访问日志中得到. ...

  6. aardio + VBScript 混合开发

    aardio 与 VBScript 可以直接混合编程,VBScript 属于 Windows 系统自带组件 -- 可以方便地生成独立 EXE 程序. 快速入门 首先创建 VBScript 解释器,aa ...

  7. ERP 软件为什么很贵?

    ERP软件的贵体现在两个方面,一个是软件系统贵,一个是部署实施贵,究其原因,就是ERP专业性太高.内部业务逻辑忒复杂,而面向形形色色的实体企业时个性化需求又加剧了它整体的复杂性,实施部署客制化无法避免 ...

  8. P5657 [CSP-S2019] 格雷码 (找规律)

    观察几个数据,有一种思路:类似于二分,判断每一位应该填1还是0: 1 #include <bits/stdc++.h> 2 //#define loveGsy 3 using namesp ...

  9. .NET 5 设计 API (资源站)

    跟新于 2022-11日 数据抓取端 随着数据的增多,问题也越来越多 用redis 主要是为了 以后进行,多个数据库写入. 例如我搭建一个 别的数据库论坛,我直接拿数据去redis里面拿,就不用跨库查 ...

  10. ASP.NET Core :缓存系列(四):内存缓存 MemoryCache

    System.Runtime.Caching/MemoryCache ICacheEntry 接口中的属性:具体设置过期时间 可以参考:微软文档ICacheEntry 接口 缓存基本使用 (一) 绝对 ...