Golang flag包使用详解(一)
概述
flag包提供了一系列解析命令行参数的功能接口
命令行语法
命令行语法主要有以下几种形式
-flag //只支持bool类型
-flag=x
-flag x //只支持非bool类型
以上语法对于一个或两个‘-’号,效果是一样的,但是要注意对于第三种情况,只支持非bool类型,原因是碰到如下情况时
cmd -x *
*为0,false有可能表示一个文件名或文件,也有可能表示x标签的值为0或false,会产生二义性,因此规定第三种只支持非bool类型。对于整形flag,合法的值可以为1234, 0664,0x1234或负数等。对于布尔型flag,可以为1, 0, t, f, T, F,true, false, TRUE, FALSE, True, False等
命令行参数解析方法
使用flag主要包括以下几步
定义flag参数,有三种方式
通过
flag.String(), Bool(), Int()等flag.Xxx()方法,该种方式返回一个相应的指针import "flag"
var ip = flag.Int("flagname", 1234, "help message for flagname")
通过
flag.XxxVar()方法将flag绑定到一个变量,该种方式返回值类型,如var flagvar int
func init() {
flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
}
通过
flag.Var()绑定自定义类型,自定义类型需要实现Value接口(Receives必须为指针),如flag.Var(&flagVal, "name", "help message for flagname")
对于这种类型的flag,默认值为该变量类型的初始值
调用
flag.Parse()解析命令行参数到定义的flagflag.Parse()
解析函数将会在碰到第一个非flag命令行参数时停止,非flag命令行参数是指不满足命令行语法的参数,如命令行参数为
cmd --flag=true abc则第一个非flag命令行参数为“abc”调用Parse解析后,就可以直接使用flag本身(指针类型)或者绑定的变量了(值类型)
fmt.Println("ip has value ", *ip)
fmt.Println("flagvar has value ", flagvar)
还可通过
flag.Args(),flag.Arg(i)来获取非flag命令行参数如果需要每个函数的详细demo,可参见Gopkg:flag
示例
示例1: 获取“species” flag的值,默认为“gopher”
var species = flag.String("species", "gopher", "the species we are studying")
示例2: 两个flag共享同一个变量,一般用于同时实现完整flag参数和对应简化版flag参数,需要注意初始化顺序和默认值
var gopherType string func init() {
const (
defaultGopher = "pocket"
usage = "the variety of gopher"
)
flag.StringVar(&gopherType, "gopher_type", defaultGopher, usage)
flag.StringVar(&gopherType, "g", defaultGopher, usage+"(shorthand)")
}
示例3: 将flag绑定用户自定义类型。按我们先前所说,只需要实现Value接口,但实际上,如果需要取值的话,需要实现Getter接口,看下接口定义就明白了:
type Getter interface {
Value
Get(string) interface{}
}
type Value interface {
String() string
Set(string) error
}
接下来,我们实现一个解析并格式化命令行输入的时间集合的例子,如下
package main import (
"errors"
"flag"
"fmt"
"strings"
"time"
) type interval []time.Duration //实现String接口
func (i *interval) String() string {
return fmt.Sprintf("%v", *i)
} //实现Set接口,Set接口决定了如何解析flag的值
func (i *interval) Set(value string) error {
//此处决定命令行是否可以设置多次-deltaT
if len(*i) > 0 {
return errors.New("interval flag already set")
}
for _, dt := range strings.Split(value, ",") {
duration, err := time.ParseDuration(dt)
if err != nil {
return err
}
*i = append(*i, duration)
}
return nil
} var intervalFlag interval func init() {
flag.Var(&intervalFlag, "deltaT", "comma-separated list of intervals to use between events")
} func main() {
flag.Parse()
fmt.Println(intervalFlag)
}
运行结果:
//./commandLine -deltaT 61m,72h,80s
[1h1m0s 72h0m0s 1m20s]
Golang flag包使用详解(一)的更多相关文章
- golang格式化输出-fmt包用法详解
golang格式化输出-fmt包用法详解 注意:我在这里给出golang查询关于包的使用的地址:https://godoc.org 声明: 此片文章并非原创,大多数内容都是来自:https:// ...
- 抓包工具:tcpdump抓包命令详解
抓包工具:tcpdump抓包命令详解 简介: tcpdump全称:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以 ...
- 整合Spring时Service层为什么不做全局包扫描详解
合Spring时Service层为什么不做全局包扫描详解 一.Spring和SpringMVC的父子容器关系 1.讲问题之前要先明白一个关系 一般来说,我们在整合Spring和SpringMVC这两个 ...
- TCP协议粘包问题详解
TCP协议粘包问题详解 前言 在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题.本章主要介绍TCP粘包的原理与其三种解决粘包的方案.并且还会介绍为什么UDP协议不会产生粘包. 基 ...
- spring盒springMVC整合父子容器问题:整合Spring时Service层为什么不做全局包扫描详解
整合Spring时Service层为什么不做全局包扫描详解 一.Spring和SpringMVC的父子容器关系 1.讲问题之前要先明白一个关系 一般来说,我们在整合Spring和SpringMVC这两 ...
- golang(11) 反射用法详解
原文链接:http://www.limerence2017.com/2019/10/14/golang16/ 反射是什么 反射其实就是通过变量动态获取其值和类型的一种技术,有些语言是支持反射的比如py ...
- 【Python实战】模块和包导入详解(import)
1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...
- Spring3.0.5jar包用法详解 [转载]
Spring3.X以后jar包进行了重构,取消了原来2.X版本中的总的spring.jar包,而是把总包中的功能全部分开打包.正在向osgi靠拢. 各个jar包详解如下: 1. org.springf ...
- Golang : flag 包简介
在 Golang 程序中有很多种方法来处理命令行参数.简单的情况下可以不使用任何库,直接处理 os.Args:其实 Golang 的标准库提供了 flag 包来处理命令行参数:还有第三方提供的处理命令 ...
随机推荐
- c#发送邮件功能
protected void Page_Load(object sender, EventArgs e) { //先到qq邮箱设置中启用smtp服务 Random r ...
- 容器————priority_queue
#include <queue> 与queue不同的是可以自定义其中数据的优先级,让优先级高的先出队列. 优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本 ...
- zabbix监控winserver网卡流量
当前基于windows2008系统安装配置zabbix客户端,服务端为linux系统 1.设置防火墙规则 开启防火墙入站(tcp和udp)10050端口 2.在zabbix官网上下载windows包 ...
- Qt4 QWebView的使用例子
最近项目中使用QT4框架开发PC端软件,所以耐着性子学习了一下QT相关的东西. 下面是QT4中QWebView的使用方法,觉得蛮方便的. 我使用的开发环境是:Win7+Qt 4.8.5开发库+qtcr ...
- tomcat+nginx 单机部署多应用LINUX
1.首先虚拟机上安装nginx 和tomcat,这里安装就不赘述了. nginx安装可以参考https://www.linuxidc.com/Linux/2016-09/134907.htm,相关配置 ...
- android中使用MediaPlayer和SurfaceView播放视频
package com.test.video; import java.io.IOException; import android.media.AudioManager; import androi ...
- Linux环境安装Nginx步骤
centos7平台编译环境使用如下指令安装: 1. 安装make: yum -y install gcc automake autoconf libtool make 2. 安装g++: yum -y ...
- JSON对象排序并生成URL参数
1、for in function jsontourl(param) { let params = {}, data=[]; let arr = Object.keys(param).sort(); ...
- ES模块的基本用法常见使用问题
本文作者:高峰,360奇舞团前端工程师,W3C WoT工作组成员. ES6中引入了模块(Modules)的概念,相信大家都已经挺熟悉的了,在日常的工作中应该也都有使用. 本文会简单介绍一下ES模块的优 ...
- DenyHosts 安全限制ssh防暴力破解
DenyHosts是Python语言写的一个程序,它会分析sshd的日志文件(/var/log/secure),当发现重 复的攻击时就会记录IP到/etc/hosts.deny文件,从而达到自动屏IP ...