为什么80%的码农都做不了架构师?>>>   

在写命令行程序时,对命令参数进行解析是常见的需求。各种语言一般都会提供解析命令行参数的方法或库,以方便程序员使用。如果命令行参数纯粹自己写代码解析,对于比较复杂的,还是挺费劲的。在Go标准库中提供了一个包:flag,方便进行命令行解析。

1、读取命令行参数

见如下 command-line-arguments.go 文件

package mainimport "os"
import "fmt"func main() {//os.Args 提供原始命令行参数访问功能。注意,切片中的第一个参数是该程序的路径,//并且 os.Args[1:]保存所有程序的的参数。argsWithProg := os.ArgsargsWithoutProg := os.Args[1:]//你可以使用标准的索引位置方式取得单个参数的值。arg := os.Args[3]fmt.Println(argsWithProg)fmt.Println(argsWithoutProg)fmt.Println(arg)
}/*
要实验命令行参数,最好先使用 go build 编译一个可执行二进制文件
$ go build command-line-arguments.go
$ ./command-line-arguments a b c d
[./command-line-arguments a b c d]
[a b c d]
c
*/

2、命令行标志的基本实现

令行标志是命令行程序指定选项的常用方式。例如,在 wc -l 中,这个 -l 就是一个命令行标志。

package main
// Go 提供了一个 flag 包,支持基本的命令行标志解析。我们将用这个包来实现我们的命令行程序示例。
import "flag"
import "fmt"func main() {//基本的标记声明仅支持字符串、整数和布尔值选项。这里我们声明一个默认值为 "foo" 的字符串标志 word并带有一个简短的描述。这里的 flag.String 函数返回一个字符串指针(不是一个字符串值),在下面我们会看到是如何使用这个指针的。wordPtr := flag.String("word", "foo", "a string")//使用和声明 word 标志相同的方法来声明 numb 和 fork 标志。numbPtr := flag.Int("numb", 42, "an int")//Bool类型的标志有点特别,在命令行中 使用 -fork 即可设置值为trueboolPtr := flag.Bool("fork", false, "a bool")//用程序中已有的参数来声明一个标志也是可以的。注意在标志声明函数中需要使用该参数的指针。var svar stringflag.StringVar(&svar, "svar", "bar", "a string var")//所有标志都声明完成以后,调用 flag.Parse() 来执行命令行解析。flag.Parse()//这里我们将仅输出解析的选项以及后面的位置参数。注意,我们需要使用类似 *wordPtr 这样的语法来对指针解引用,从而得到选项的实际值。fmt.Println("word:", *wordPtr)fmt.Println("numb:", *numbPtr)fmt.Println("fork:", *boolPtr)fmt.Println("svar:", svar)fmt.Println("tail:", flag.Args())
}/*
测试这个程序前,最好将这个程序编译成二进制文件,然后再运行这个程序。
$ go build command-line-flags.go
word: opt
numb: 7
fork: true
svar: flag
tail: []
注意到,如果你省略一个标志,那么这个标志的值自动的设定为他的默认值。
$ ./command-line-flags -word=opt
word: opt
numb: 42
fork: false
svar: bar
tail: []
位置参数可以出现在任何标志后面。
$ ./command-line-flags -word=opt a1 a2 a3
word: opt
...
tail: [a1 a2 a3]
注意,flag 包需要所有的标志出现位置参数之前(否则,这个标志将会被解析为位置参数)。
$ ./command-line-flags -word=opt a1 a2 a3 -numb=7
word: opt
numb: 42
fork: false
svar: bar
trailing: [a1 a2 a3 -numb=7]
使用 -h 或者 --help 标志来得到自动生成的这个命令行程序的帮助文本。
$ ./command-line-flags -h
Usage of ./command-line-flags:-fork=false: a bool-numb=42: an int-svar="bar": a string var-word="foo": a string
如果你提供一个没有使用 flag 包指定的标志,程序会输出一个错误信息,并再次显示帮助文本。
$ ./command-line-flags -wat
flag provided but not defined: -wat
Usage of ./command-line-flags:
...
*/

3、命令行参数的进阶实现

package mainimport ("flag""os""log""fmt"
)func printUsage()  {fmt.Println("Usage:")fmt.Println("\taddblock -data DATA -- 交易数据.")fmt.Println("\tprintchain -- 输出区块信息.")}func isValidArgs()  {if len(os.Args) < 2 {printUsage()os.Exit(1)}
}func main()  {isValidArgs()addBlockCmd := flag.NewFlagSet("addBlock",flag.ExitOnError)printChainCmd := flag.NewFlagSet("printchain",flag.ExitOnError)flagAddBlockData := addBlockCmd.String("data","http://liyuechun.org","交易数据......")switch os.Args[1] {case "addBlock":err := addBlockCmd.Parse(os.Args[2:])if err != nil {log.Panic(err)}case "printchain":err := printChainCmd.Parse(os.Args[2:])if err != nil {log.Panic(err)}default:printUsage()os.Exit(1)}if addBlockCmd.Parsed() {if *flagAddBlockData == "" {printUsage()os.Exit(1)}fmt.Println(*flagAddBlockData)}if printChainCmd.Parsed() {fmt.Println("输出所有区块的数据........")}}//go build -o bc main.go//bc
// ./bc addBlock -data "liyuechun.org"// ./bc printchain
// 即将输出所有block

转载于:https://my.oschina.net/ruoli/blog/2907376

Go语言中命令行参数的实现相关推荐

  1. 在c语言中命令行参数是什么,C语言命令行参数

    这是可能在命令行中的一些值传递给C程序执行.特别是从参数传入,而不是外界硬编码写入这些值到代码控制程序中,这些值被称为命令行参数,很多时候,它们对程序很重要. 命令行参数使用main()函数的参数,其 ...

  2. c语言中命令行参数argc,argv[]详解

    argc 是 argument count的缩写,表示传入main函数的参数个数: argv 是 argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0 ...

  3. python 命令行参数-python中命令行参数

    python中有一个模块sys,sys.argv这个属性提供了对命令行参数的访问.命令行参数是调用某个程序时除程序名外的其他参数. sys.argv是命令行参数的列表 len(sys.argv)是命令 ...

  4. c语言学习进阶-C语言带命令行参数的文件数据批量计算

    C语言带命令行参数的文件数据批量计算 (1)假设输入文件中的数据为多行整数,把数据文件命名为"InputData.txt",也可以命名为任意的文件名,尝试设计一个c 语言程序, 主 ...

  5. c语音学习进阶-C语言带命令行参数的程序设计

    C语言带命令行参数的程序设计 (1)深入理解并学习带命令行参数的程序设计方法,使用c 语言完成带命令行参数的科学计算程序,能从给定的任意文件名的文件当中输入数据,并能向给定的任意文件名的输出文件当中输 ...

  6. c++笔记(1):C++中命令行参数argc,argc[ ]究竟是什么

    C++中命令行参数argc,argc[ ]究竟是什么 1.argc为整数 2.argv为指针的指针(可理解为:char **argv or: char *argv[] or: char argv[][ ...

  7. 文本编辑器中命令行参数的应用

    文章目录 1 文本编辑器中命令行参数的应用 1 文本编辑器中命令行参数的应用 我们要知道对于每一个应用程序我们都能够接收命令行参数,那么对于GUI系统中命令行参数如何传递到应用程序呢? 主要有如下两种 ...

  8. Ada语言中命令行使用

    Ada语言中命令行使用 要制作命令行程序,使用系统包ada.command_line .以下例程实现一个命令行程序. 命令如下:remove -iInputFileName -nCutOffNumbe ...

  9. C语言对命令行参数求和,C语言命令行参数汇总

    从命令行传递的参数称为命令行参数.这些参数由main()函数来处理的. 要支持命令行参数,您需要更改main()函数的结构,如下所示 - int main(int argc, char *argv[] ...

最新文章

  1. dbscan算法中 参数的意义_基于变参数的DBSCAN算法
  2. 在Mac下安装JMeter
  3. 【AI2】app inventor2离线开发环境百度网盘下载链接,安卓app图形化开发环境
  4. layui radio 根据获取的到值选中
  5. bzoj3277 串 (后缀数组+二分答案+ST表)
  6. 当电压放大电路的开路增益和输出电阻固定后_放大器的设计基础
  7. 用java实现学生管理系统
  8. linux ftp 150 无响应,FTP遇到150无响应
  9. 剑指offer——面试题54:表示数值的字符串
  10. 台安PLC通过手机热点远程在线模拟,远程编程,远程调试
  11. 计算机常用的内存是rom,手机内存和电脑内存是一样的吗?智能硬件常用的ROM和RAM详解...
  12. sqlmap的两种挂代理方式
  13. 从前后端分离到前后端整合的“退步”(二)pom.xml文件配置
  14. 计算机系vlog,华为Mate40系列化身vlog神器,专业好用两手抓
  15. Failover feature ‘ANSYS electronics_desktop‘ is not available. No valid FLEXlm servers specified.解决方
  16. pandas常用操作
  17. 如何快速查找下载文献
  18. 培训直播平台这些功能是必不可少的
  19. 思维模型 STAR原则
  20. JavaWeb_04_ELJSTL

热门文章

  1. 二分查找算法(C#实现)
  2. 设置 cell点击 背景色
  3. magento如何在首页显示产品
  4. 二维数组作数据源填充到repeater
  5. 软考信息系统项目管理师_信息系统安全管理---软考高级之信息系统项目管理师026
  6. 大数据之-Hadoop之HDFS_hadoop集群中的安全模式_操作案例---大数据之hadoop工作笔记0075
  7. STM32工作笔记0029---认识电路原理图中的VCC,VDD,VEE,VSS
  8. STM32工作笔记0016---MDK开发环境安装
  9. SpringCloud工作笔记076--- CheckStyle插件提高java代码质量
  10. java零碎要点---Tesseract 3.0,Java OCR 图像智能字符识别技术,可识别中文