概述

  常用的命令行参数解析有 2 种方式,一种是不带参数标签直接接上参数值,另外一种就是带有标签的参数解析。第一种我们可以直接通过 os 包提供的原始方法获取,第二种我们需要通过 flag 包来解析获得。

不带标签参数解析

  先看以下源码案例:

package main

import (
"os"
"fmt"
) func main() {
//os.Args 提供原始命令行参数访问功能。注意:切片中的第一个参数是该程序的路径,并且 os.Args[1:]保存所有的的参数。
argsAll := os.Args
fmt.Println(argsAll)
//取得对我们有意义的参数内容
argsUserful := os.Args[:]
fmt.Println(argsUserful)
}

打开终端找到你对应编写的这个类通过go命令运行,这里我的文件名:commandTest.go

// 在终端运行命令: go run commandTest.go a b c
[*/command-line-arguments/_obj/exe/22_flag_example a b c]
[a b c]

  通过以上代码可以看出,有一个默认的参数为该 go 可运行文件等路径,结果中的 * 是我修改的,因为我的本地环境为 Mac,前面会跟一大堆自己本地路径,为了节省篇幅和消除歧义就将前面的路径修改为*,代表前面会出现任何字符。从第二个字符开始就是我们真正输入的参数,故在第二个打印的结果中可以看到。使用这种效果优点就是很容易,但是弊端也很明显,就是只有开发者本人才知道第一个参数、第二个参数、第三个参数各自代表的意思,到最后就没有人知道各自的含义了,如果只是一个参数的话,这个方案还是可以使用的,如果超过1个参数建议使用后面讲到的第二种带标签解析参数方式。

带标签参数解析

  所谓的带标签命令行参数解析形如:-n name -u update ...,当你使用的时候通过标签 n 和 u 得到指定的value值,这样其他人使用的时候可以通过 help 来查看各个标签代表的意思来传入符合自己需求的值。那么我们先来看一段代码以及运行结果,让我们感受一下

package main

import (
"flag"
"log"
) func usage() {
log.Fatalf("Usage: myProgram [-s server] [-t isShowTimeStamps] <subject> \n")
} func printMsg(message string) {
log.Printf("Received message is : %s \n", message)
} func main() {
/**
第一个参数:设置对应的标签名,可以通过该标签名来或得对应值
第二个参数:如果没有设置该标签,则采用这个值即该值为默认值
第三个参数:这个参数为帮助信息,一般用于help调用展示
*/
var message = flag.String("s", "default message", "it's user send message[help message]")
var showTime = flag.Bool("t", false, "Display timestamps") /**
格式化log输入内容,默认为:log.LstdFlags(底层等价:Ldate | Ltime), Ldate:2017/04/01 , Ltime:16:24:36,
Llongfile:全路径+执行文件+行数, Lshortfile:执行文件名+行数,还有几个其他不常用的,需要的话可以上官方文档查看
这里设置的0即取消log格式化输出,输出的内容和使用fmt包下的println()格式一样
*/
//log.SetFlags(0)
log.SetFlags(log.LstdFlags)
//初始化flag包中内置的匿名Usage函数,需要赋一个函数。当flag内部发生异常会调用其内部的Usage函数,继而再调用到我们自己定义的usage函数
flag.Usage = usage
//所有标志都声明完成以后,调用 flag.parse() 来执行命令行解析
flag.Parse() //用户没有任何参数输入则不得向下执行
args := flag.Args()
if len(args) < {
usage()
} log.Println("message:", *message, ", showTime:", *showTime)
printMsg(*message) }

当什么参数都不输入,即运行命令:go run commandTest.go

Usage: myProgram [-s server] [-t isShowTimeStamps] <subject>
exit status 1

输入对应的参数,即运行命令:go run commandTest.go -s localhost -t true

2017/04/01 16:41:45 message: localhost , showTime: true
2017/04/01 16:41:45 Received message is : localhost

总结:以上代码就是针对命令行参数解析道基本应用,如果有想要更加深入了解的话,那就直接上官方文档查看吧,文档写的还是很简明精要的。

Go_12:Go命令行处理的更多相关文章

  1. Cmder--Windows下命令行利器

    cmder cmder是一个增强型命令行工具,不仅可以使用windows下的所有命令,更爽的是可以使用linux的命令,shell命令. 安装包 安装包链接 下载后,直接解压即用. 修改命令提示符λ为 ...

  2. .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门

    2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文章,原因是.NET Core的入门门槛相当高, ...

  3. 让 windows 下的命令行程序 cmd.exe 用起来更顺手

    在 Windows 下使用 Larave 框架做开发,从 Composer 到 artisan 总是避免不了和 cmd.exe 打交道,系统默认的命令行界面却是不怎么好看,且每行显示的字符数是做了限制 ...

  4. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  5. Java程序:从命令行接收多个数字,求和并输出结果

    一.设计思想:由于命令行接收的是字符串类型,因此应先将字符串类型转化为整型或其他字符型,然后利用for循环求和并输出结果 二.程序流程图: 三.源程序代码:   //王荣荣 2016/9/23     ...

  6. Android 在Android代码中执行命令行

    1.路径最好不要是自己拼写的路径/mnt/shell/emulated/0/wifidog.conf 最好是通过方法获取的路径,不然可能导致命令无效  (挂载点的原因) public static f ...

  7. windows下的命令行工具babun

    什么是babun babun是windows上的一个第三方shell,在这个shell上面你可以使用几乎所有linux,unix上面的命令,他几乎可以取代windows的shell.用官方的题目说就是 ...

  8. 像黑客一样使用 Linux 命令行

    前言 之前在博客园看到一篇介绍 IntelliJ IDEA 配置的文章,它里面用的是 gif 动态图片进行展示,我觉得很不错.所以在我今天以及以后的博文中,我也会尽量使用 gif 动图进行展示.制作 ...

  9. python处理命令行参数

    直接从命令行执行py文件的时候如果带有参数,如何获取这些参数,如何解析? http://blog.chinaunix.net/uid-20786165-id-3182268.html sys.argv ...

随机推荐

  1. python下graphviz安装

    参考链接:https://blog.csdn.net/u013250416/article/details/72790754 1.安装Graphviz 在graphviz的官网(网址:http://w ...

  2. Final发布用户使用报告 -- Thunder团队

    Thunder爱阅app Final发布用户使用报告 用户数量:14人 以下为用户评论:(注:为了保护用户的姓名权,以下用户名以昵称形式给出.) 序列 昵称 个人信息 获得软件途径 使用次数 用户评论 ...

  3. Scrum Meeting 11.11

    成员 今日任务 明日计划 用时 徐越 学习UI设计并重构上传下载界面     赵庶宏       薄霖 UI代码更新     卞忠昊 Xfermode与PorterDuff     武鑫 界面设计:独 ...

  4. 《UML大战需求分析》-读后感一

    UML英文全拼是unified modeling language 就是统一建模语言. UML就是一种软件开发中帮助我们设计的标准,虽然说是建模语言但是它是图形,图形能更清楚的表达我们对软件的想法.U ...

  5. CANopen 基础

    1. TPDO和RPDO都是针对从站来说的,协议上没有有讲任何一个关于主站的概念,协议就只是定义从站,没有定义主站任何东西.TPDO:从站->主站RPDO:主站->从站 2. PDO的CO ...

  6. .NET WinForm下StatusStrip控件如何设置分隔线及部分子控件右对齐

    ssInfo.LayoutStyle = ToolStripLayoutStyle.StackWithOverflow;//StatusStrip 控件 tsslUpdate.Alignment = ...

  7. contos7忘记root密码怎么办

    首先在这个界面按"e"键 然后呢就会进入到如下图所示的界面,在LANG=zh_CN.UTF8的后面加上 init=/bin/sh, 再按 [ Ctrl + X ] 进入'单用户模式 ...

  8. “Unable to open kernel device \\.\Global\vmx86

    启动vm中虚拟机中的时候,弹出窗口的时候,弹出窗口 Unable to open kernel device \\.\Global\vmx86;系统找不到指定的文件,Did you reboot af ...

  9. 开发模式 MVC、MVP、MVVM和MVX框架模式

    MVX框架模式的了解 MVX框架模式:MVC+MVP+MVVM 1.MVC: Model(模型)+View(视图)+controller(控制器),主要是基于分层的目的,让彼此的职责分开.View通过 ...

  10. Mysql高并发情况下的解决方案(转)

    查询了下Mysql 关于高并发的处理的资料,在这记录一下. 高并发大多的瓶颈在后台数据逻辑处理,在存储,mysql的正常的优化方案如下: 1.代码中sql语句优化 2.数据库字段优化,索引优化 3.加 ...