flag包是Go语言标准库提供用来解析命令行参数的包,使得开发命令行工具更为简单

常用方法

1.flag.Usage

输出使用方法,如linux下ls -h的帮助输出

2.flag.Type(参数名, 默认值, 使用提示)

Type为类型 如String, Int, Uint 调用相应的flag.Sring flag.Int flag.Uint方法

方法返回相应类型的指针

3.flag.Type(指针, 参数名, 默认值, 使用提示)

与flag.Type方法基本相同,不同的是多一个指针参数,将使用传入的指针,不会再创建指针返回

4.flag.Args

返回解析完命令行参数后的其他参数,如./sh -name cqh  a1 a2,将返回a1 a2

5.flag.Parse

执行解析

使用示例代码

创建test.go

package main

import (
"fmt"
"flag"
) func main() {
namePtr := flag.String("name", "username", "姓名")
agePtr := flag.Int("age", 18, "年龄")
musclePtr := flag.Bool("muscle", true, "是否有肌肉") var email string
flag.StringVar(&email, "email", "chenqionghe@sina.com", "邮箱") flag.Parse() args := flag.Args()
fmt.Println("name:", *namePtr)
fmt.Println("age:", *agePtr)
fmt.Println("muscle:", *musclePtr)
fmt.Println("email:", email)
fmt.Println("args:", args)
}

  

执行go buld后,建立test执行文件

./test -h

输出

Usage of ./test:
-age int
年龄 (default 18)
-email string
邮箱 (default "chenqionghe@sina.com")
-muscle
是否有肌肉 (default true)
-name string
姓名 (default "username")

 

执行

./test -name 肌肉男 -age 20 -email muscle@muscle.com 哈哈 呵呵 嘿嘿

 输出

name: 肌肉男
age: 20
muscle: true
email: muscle@muscle.com
args: [哈哈 呵呵 嘿嘿]

  

自定义flag

只要实现flag.Value接口即可

type Value interface {
String() string
Set(string) error
}

如下定义了一个Hello类型,实现了Value接口

//自定义解析参数,实现Set和String方法
type Hello string func (p *Hello) Set(s string) error {
v := fmt.Sprintf("Hello %v", s)
*p = Hello(v)
return nil
} func (p *Hello) String() string {
return fmt.Sprintf("%f", *p)
}

使用示例代码  

package main

import (
"fmt"
"flag"
) //自定义解析参数,实现Set和String方法
type Hello string func (p *Hello) Set(s string) error {
v := fmt.Sprintf("Hello %v", s)
*p = Hello(v)
return nil
} func (p *Hello) String() string {
return fmt.Sprintf("%f", *p)
} func main() {
namePtr := flag.String("name", "username", "姓名")
agePtr := flag.Int("age", 18, "年龄")
musclePtr := flag.Bool("muscle", true, "是否有肌肉") var email string
flag.StringVar(&email, "email", "chenqionghe@sina.com", "邮箱") var hello Hello
flag.Var(&hello, "hello", "hello参数") flag.Parse()
others := flag.Args()
fmt.Println("name:", *namePtr)
fmt.Println("age:", *agePtr)
fmt.Println("vip:", *musclePtr)
fmt.Println("hello:", hello)
fmt.Println("email:", email)
fmt.Println("other:", others)
}

  

重新build后运行

./test -name 肌肉男 -age 20 -email muscle@muscle.com -hello 陈琼和  哈哈 呵呵 嘿嘿

 输出

name: 肌肉男
age: 20
vip: true
hello: Hello 陈琼和
email: muscle@muscle.com
other: [哈哈 呵呵 嘿嘿]

  

就是这样,Light weight baby !

Go使用flag包开发命令行工具的更多相关文章

  1. 用PHP开发命令行工具

    介绍 用过laravel开发过项目的都应该用过artisan,通过artisan我们可以在命令行中创建控制器类,Eloquent类等,今天我们将通过php来开发命令行工具 开发环境与工具 使用vagr ...

  2. Apache Commons CLI 开发命令行工具示例

    概念说明Apache Commons CLI 简介 虽然各种人机交互技术飞速发展,但最传统的命令行模式依然被广泛应用于各个领域:从编译代码到系统管理,命令行因其简洁高效而备受宠爱.各种工具和系统都 提 ...

  3. node.js 开发命令行工具 发布npm包

    新建一个文件夹“nodecmd”: 在nodecmd下新建文件夹bin: 在bin文件夹下新建JavaScript文件hello.js #!/usr/bin/env node console.log( ...

  4. [Go] gocron源码阅读-flag包实现命令行参数获取

    调用flag包可以方便的获取到命令行中传递的参数,比如可以实现类似nginx执行程序获取命令行参数执行不同操作的目标 package main import ( "flag" &q ...

  5. 使用 Apache Commons CLI 开发命令行工具示例

    Apache Commons CLI 简介 Apache Commons CLI 是 Apache 下面的一个解析命令行输入的工具包,该工具包还提供了自动生成输出帮助文档的功能. Apache Com ...

  6. 如何用Node编写命令行工具

    0. 命令行工具 当全局安装模块之后,我们可以在控制台下执行指定的命令来运行操作,如果npm一样.我把这样的模块称之为命令行工具模块(如理解有偏颇,欢迎指正) 1.用Node编写命令行工具 在Node ...

  7. node命令行工具—cf-cli

    音乐分享: 钢心 - <龙王> 初喜<冠军>后喜<龙王> (PS:听一次钢心乐队的演出后采访才知道 “龙王”隐喻的是一起喝酒的老铁....) ——————————— ...

  8. 如何用node编写命令行工具,附上一个ginit示例,并推荐好用的命令行工具

    原文 手把手教你写一个 Node.js CLI 强大的 Node.js 除了能写传统的 Web 应用,其实还有更广泛的用途.微服务.REST API.各种工具……甚至还能开发物联网和桌面应用.Java ...

  9. mysql命令行工具

    mysql包相关命令行工具 [root@manage ~]# rpm -qa|grep mysql mysql-server-5.1.73-5.el6_7.1.x86_64 mysql-5.1.73- ...

随机推荐

  1. DNS解析全过程

    浏览器输入一个网址.要訪问该网址必须由DNS解析出相应的server的IP地址. 对于大型站点来说,一个站点相应多台server.那么DNS解析出的可能是进行负载均衡的server的IP地址.DNS解 ...

  2. VMWare 虚拟化 Ubuntu 64 (16.04)-- docker 无法链接 pull 镜像 ?(solved)

    背景 根据项目的需要,虚拟化一个Ubuntu OS 来玩 docker,虚拟机选择的是WMWare (VMware-player-14.0.0-6661328); Ubuntu的镜像来自于官网(ubu ...

  3. 【SqlServer系列】聚合函数

    1   概述 本篇文章简要回顾SQL Server  聚合函数,MAX,MIN,SUM,AVG,SUM,CHECKSUM_EGG,COUNT,STDEV,STDEVP,VAR,VARP. 2   具体 ...

  4. Oracle自动备份数据

    一. Oracle自动备份单表一个月数据 方式一:三步处理(建批处理文件,写sql文件,设置任务计划) 1. 第一步:建立一个批处理文件 @echo off Set OrclSid=orcl Set ...

  5. (转)java中的方法区

    首先要说明的是,此文章转载自 http://blog.csdn.net/zzhangxiaoyun/article/details/7518917 谢谢作者.是本人认为对方法区解释得比较清楚的一篇文章 ...

  6. 自学Python3.1-函数基础

    一.函数概述 1. 简介 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2. 组成 函数代码块以 def 关键词开头,后接函数名和圆括 ...

  7. 【ANT】java项目生成文件示例

    <?xml version="1.0" ?> <project default="dist"> <property name=&q ...

  8. 二叉树Binary_Tree(1):二叉树及其数组实现

    定义 二叉树: 二叉树是一种特殊的树.二叉树的特点是每个结点最多有两个儿子,左边的叫做左儿子,右边的叫做右儿子,或者说每个结点最多有两棵子树.更加严格的递归定义是:二叉树要么为空,要么由根结点.左子树 ...

  9. Swift 开源项目练习应用

    小的View.动画实现练习 拥有着苹果先天生态优势的Swift自发布以来,各种优秀的开源项目便层出不穷.本文作者站在个人的角度,将2014年Swift开源项目做了一个甄别.筛选,从工具.存储.网络.界 ...

  10. iOS pch文件创建使用,和info.plis文件路径改变,路径的设置

    一 路径报错: 二 pch创建设置: 一:如果要更改Info.plist与Prefix.pch文件实际路径,也就是实际文件的位置(不是在工程中的组织路径),需要到Build Settings中修改对应 ...