概述

  常用的命令行参数解析有 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

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

最新文章

  1. .NET面试题系列[9] - IEnumerable
  2. 怎么让我们自己开发的Android程序设为默认启动
  3. web 前端常用组件【03】Bootstrap Multiselect
  4. leetcode@ [199] Binary Tree Right Side View (DFS/BFS)
  5. javascript深入理解js闭包[转]
  6. vtk 中文显示
  7. nodejs爬虫——汽车之家所有车型数据
  8. 从 Spring 2.5 开始就可以使用注解来配置依赖注入,而不是采用 XML 来描述一个 bean。
  9. IoC容器的接口设计
  10. 利用python搭建Powersploit powershell脚本站点
  11. 创建用户自定义函数 SQL
  12. python 生成器、列表解析式、yield、迭代器
  13. html5文件读取+按钮样式重置+文件内容预览
  14. POJ1274 The Perfect Stall
  15. sed匹配多行替换
  16. [CEOI2018]Global warming
  17. mybatis动态sql中的两个内置参数(_parameter和_databaseId)
  18. 获取本地内网和外网IP地址
  19. 20169221 2016-2017-2《移动平台与android开发》学习总结
  20. 3、在Shell程序中使用的参数

热门文章

  1. spring boot之创建web项目并访问jsp页面
  2. A网站访问B网站,跨域问题
  3. #Leetcode# 817. Linked List Components
  4. Sql Server自增ID与序号的使用
  5. VNC Server (Ubuntu 16.04.3 GNOME)
  6. IE下Userdata本地化存储
  7. java 每一个对象都是根据hashCode区别的 每次返回不同的内存地址
  8. iOS BCD码、数据流、字节和MD5计算
  9. 自定义smokeping告警(邮件+短信)
  10. springboot整合spring @Cache和Redis