Go 的 flag 包可以解析命令行的参数。

一、命令行语法

命令行语法主要有以下几种形式:

cmd -flag       // 只支持bool类型
cmd -flag=xxx
cmd -flag xxx   // 只支持非bool类型

以上语法对于一个或两个‘-’号是一样的,即

cmd -flag xxx (使用空格,一个 - 符号)
cmd --flag xxx (使用空格,两个 - 符号)
cmd -flag=xxx (使用等号,一个 - 符号)
cmd --flag=xxx (使用等号,两个 - 符号)

对于整形 flag,合法的值可以为 1234,0664,0x1234 或 负数 等。对于布尔型 flag,可以为 1,0,t,f,T,F,true,false,TRUE,FALSE,True,False 等

其中,布尔类型的参数比较特殊,为了防止解析时的二义性,应该使用 等号 的方式指定

二、命令行参数方法

1. 定义flag参数

参数有三个:第一个为 参数名称,第二个为 默认值,第三个是 使用说明

1> 通过 flag.String(),Bool(),Int() 等 flag.Xxx() 方法,该种方式返回一个相应的指针

var ip = flag.Int("flagname", 1234, "help message for flagname")

2> 通过 flag.XxxVar() 方法将 flag 绑定到一个变量,该种方式返回 值类型,如

var flagvar int
flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")

3> 通过 flag.Var() 绑定自定义类型,自定义类型需要实现 Value 接口 (Receiver 必须为指针),如

flag.Var(&flagVal, "name", "help message for flagname")

2. 调用 flag.Parse() 解析命令行参数到定义的 flag

flag.Parse()

解析函数将会在碰到第一个 非flag 命令行参数时停止,非flag 命令行参数是指不满足命令行语法的参数,如命令行参数为 cmd --flag=true abc 则第一个 非flag 命令行参数为“abc”

3. 调用 Parse 解析后,就可以直接使用 flag 本身(指针类型)或者绑定的变量了(值类型)

fmt.Println("flagvar has value ", flagvar)

还可通过 flag.Args(), flag.Arg(i) 来获取 非flag 命令行参数!

三、实例

package main

import (
"flag"
"fmt"
) func main() {
username := flag.String("name", "", "Input your username")
flag.Parse()
fmt.Println("Hello, ", *username)
}

编译:

go build flag.go

运行:

./flag -name=world

输出:

Hello, world

Go 还允许 自定义“命令行参数解析规则”,如下接口所示:

FlagSet 结构:

type FlagSet struct {
Usage func()
}

示例:

package main

import (
"flag"
"fmt"
) var myFlagSet = flag.NewFlagSet("myflagset", flag.ExitOnError)
var stringFlag = myFlagSet.String("abc", "default value", "help mesage") func main() {
myFlagSet.Parse([]string{"-abc", "def", "ghi", "123"})
args := myFlagSet.Args()
for i := range args {
fmt.Println(i, myFlagSet.Arg(i))
}
}

最新文章

  1. 如何查看Oracle客户端版本
  2. 【转】简析 .NET Core 构成体系
  3. VS.net 2013中使用Git建立源代码管理 版本管理
  4. String 类相关知识
  5. JNative library not loaded, sorry ! win7 64位系统
  6. j.一个NIO与SSLEngine结合的例子
  7. three.js
  8. php 常用变量与函数
  9. 编写高质量JS代码的68个有效方法(九)
  10. 读书笔记——Windows核心编程(8)Interlocked单向链式栈
  11. hdu4283 区间dp
  12. myeclipse 8.5安装freemarker插件方法
  13. 《Spring3.0就这么简单》第1章快速入门
  14. 用XAML做网页!!—广告展示区
  15. 旋转图css3
  16. Shell 快速指南
  17. Javascript基础语法(一)
  18. 新建git仓库并与github同步
  19. 如何优雅地使用Sublime Text3
  20. Java8 容器类详解

热门文章

  1. 第5月第8天 jsonmodel
  2. Ettercap之ARP+DNS欺骗
  3. 【mac】7z 终端命令行
  4. jmeter --使用put方法上传文件
  5. 通过 EXPLAIN 分析低效 SQL 的执行计划
  6. Vmware中Linux或macOS客户端如何回收硬盘空间
  7. Ibatis.Net 执行存储过程学习(八)
  8. yolov2在CUDA8.0+cudnn8.0下安装、训练、检测经历
  9. Linux下配置MySQL需要注意的几点
  10. linux系统入门一些常用命令解析