Go使用flag包开发命令行工具
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包开发命令行工具的更多相关文章
- 用PHP开发命令行工具
介绍 用过laravel开发过项目的都应该用过artisan,通过artisan我们可以在命令行中创建控制器类,Eloquent类等,今天我们将通过php来开发命令行工具 开发环境与工具 使用vagr ...
- Apache Commons CLI 开发命令行工具示例
概念说明Apache Commons CLI 简介 虽然各种人机交互技术飞速发展,但最传统的命令行模式依然被广泛应用于各个领域:从编译代码到系统管理,命令行因其简洁高效而备受宠爱.各种工具和系统都 提 ...
- node.js 开发命令行工具 发布npm包
新建一个文件夹“nodecmd”: 在nodecmd下新建文件夹bin: 在bin文件夹下新建JavaScript文件hello.js #!/usr/bin/env node console.log( ...
- [Go] gocron源码阅读-flag包实现命令行参数获取
调用flag包可以方便的获取到命令行中传递的参数,比如可以实现类似nginx执行程序获取命令行参数执行不同操作的目标 package main import ( "flag" &q ...
- 使用 Apache Commons CLI 开发命令行工具示例
Apache Commons CLI 简介 Apache Commons CLI 是 Apache 下面的一个解析命令行输入的工具包,该工具包还提供了自动生成输出帮助文档的功能. Apache Com ...
- 如何用Node编写命令行工具
0. 命令行工具 当全局安装模块之后,我们可以在控制台下执行指定的命令来运行操作,如果npm一样.我把这样的模块称之为命令行工具模块(如理解有偏颇,欢迎指正) 1.用Node编写命令行工具 在Node ...
- node命令行工具—cf-cli
音乐分享: 钢心 - <龙王> 初喜<冠军>后喜<龙王> (PS:听一次钢心乐队的演出后采访才知道 “龙王”隐喻的是一起喝酒的老铁....) ——————————— ...
- 如何用node编写命令行工具,附上一个ginit示例,并推荐好用的命令行工具
原文 手把手教你写一个 Node.js CLI 强大的 Node.js 除了能写传统的 Web 应用,其实还有更广泛的用途.微服务.REST API.各种工具……甚至还能开发物联网和桌面应用.Java ...
- mysql命令行工具
mysql包相关命令行工具 [root@manage ~]# rpm -qa|grep mysql mysql-server-5.1.73-5.el6_7.1.x86_64 mysql-5.1.73- ...
随机推荐
- Android ImageLoader(Android-Universal-Image-Loader)【1】概述及使用简单介绍
Android ImageLoader(Android-Universal-Image-Loader)[1]概述及使用简单介绍 一,前言:为什么要引入Android-Universal-Imag ...
- Android Api 检查參数状态Api
转载请注明出处:http://blog.csdn.net/droyon/article/details/39938677 在进行Android应用程序开发中,android提供了一个非常好的工具类,来 ...
- Windows 下Oracle database 9i 64bit 仅仅有 Windows Itanium 64bit
Windows 下Oracle database 9i 64bit 仅仅有 Windows Itanium 64bit,没有Windows x86-64bit的 详细请见例如以下的certificat ...
- 前端MVC Vue2学习总结(一)——MVC与vue2概要、模板、数据绑定与综合示例
一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.Vue是框架而jQuery则是库. 1.2.AMD与CM ...
- 自学Python4.1-文件操作
文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 关闭文件(非必须) 一.打开文件 open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式打开文件,打 ...
- Eclipse 插件安装、升级和卸载的方法
Eclipse 的插件可以装在内部,也可以装在外部,装在内部的方法很简单:把插件的features和plugins目录copy到eclipse的安装目录即可. eclipse和其插件升级比较频繁,用过 ...
- springMVC上传错误StandardMultipartHttpServletRequest
异常信息 java.lang.ClassCastException: org.springframework.security.web.servletapi.HttpServlet3RequestFa ...
- log4go的输出优化
又看了一些golang的日志包和相关的文章,仔细阅读了go 1.9.2系统提供的log和go-log,产生了对log4go的日志输出进行优化的想法. 结构化与multiwriter log使用mult ...
- OC学习11——循环引用与@class
转载自 OC学习篇之---@class关键字的作用以及#include和#import的区别 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#in ...
- 用过的关于css的知识
1.代码片段 让两个div并排起来显示. <div style="width:1000px; text-align:center;" id="content&quo ...