作用

主要用来实现命令行的参数解析,以达到实现以下效果的目的

$ cmd -flagname 123

使用方式

flag是Go语言的内置包,能接收的参数类型主要有字符串、布尔和数值类型。

方式一

func main() {
var ip = flag.String("ip", "127.0.0.1", "此处传入IP地址")
flag.Parse()
fmt.Println(*ip)
}

我们在main函数中调用flag.String函数来定义命令,该函数共有三个参数

  • 第一个参数是命令名称
  • 第二个参数为默认值,也就是不传ip时默认拿到的值
  • 第三个参数是给用户的提示

同时该函数返回的是指针类型,打印变量ip时记得加上指针符号来输出地址对应的值。在执行flag.String后,记得执行flag.Parse来解析命令,否则不能执行成功。我们来测试一下,先键入一个错的参数,会得到以下提示。

go run main.go -i

flag provided but not defined: -i
Usage of /var/folders/3s/5v6r481x17x5ks_7q1dzmlsw0000gp/T/go-build400337564/b001/exe/main:
-ip string
此处传入IP地址 (default "127.0.0.1")

加上-ip参数和值,可以直接获取到对应的值

go run main.go -ip 192.168.1.1

192.168.1.1

除了-ip 192.168.1.1这种形式外,以等号赋值的方式也是支持的

go run main.go -ip=192.168.1.1

192.168.1.1

现在什么都不传,可以直接拿到设置的默认值

go run main.go

127.0.0.1

方式二

除上述内容之外,还有一种写法,我们再增加一个端口号为例

var port int

func init() {
flag.IntVar(&port, "port", 80, "端口号")
} func main() {
flag.Parse()
fmt.Println("port", port)
}

首先定义一个整型变量port,在init函数中调用flag.IntVar函数,该函数与flag.String相比,少了返回值,且多一个参数,第一个参数是预先定义好的变量,为了方便IntVar内部修改变量值,所以该参数传引用类型。

方式三

如果我们想在接收参数值的过程当中做一些处理,那么也可以自己进行实现。假如我们需要对传入的用户名user进行处理,加上一个_suffix后缀。

type user string

func (u *user) String() string {
return fmt.Sprint(*u)
} func (u *user) Set(value string) error {
if len(value) < 3 {
return errors.New("姓名长度不得小于3位")
}
*u = user(value + "_suffix")
return nil
}

首先需要定义一个类型,然后实现两个方法String与Set,在Set方法中我对传入的值进行了长度判断,如果小于3个字符就抛出错误,否则就将传入的值拼接一个后缀_suffix

var userFlag user

func main() {
flag.Var(&userFlag, "user", "用户名")
flag.Parse()
fmt.Println(userFlag)
}

接下来定义一个user类型的变量,然后在main函数中调用flag.Var方法,将变量地址传入,接下来执行命令做测试。

go run flagVar.go -user pingye
pingye_suffix

成功拼接上了后缀。

Go语言组件学习示例开源库,欢迎star

https://github.com/EnochZg/golang-examples

理解Go语言组件flag的更多相关文章

  1. 【转载】理解C语言中的关键字extern

    原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻 ...

  2. 深入理解c语言_从编译器的角度考虑问题_纪念Dennis Ritchie先生

    开源中国: Dennis Ritchie教授过世了,他发明了C语言,一个影响深远并彻底改变世界的计算机语言.一门经历40多年的到今天还长盛不训的语言,今天很多语言都受到C的影 响,C++,Java,C ...

  3. 深入理解C语言的函数调用过程 【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-4240084.html 原文地址:深入理解C语言的函数调用过程 作者:wjlkoorey258     本文 ...

  4. "深入理解C语言" 指针

    本文对coolshell中的"深入理解C语言"这篇文章中提到的指针问题, 进行简要的分析. #include <stdio.h> int main(void){ ]; ...

  5. 理解C语言中指针的声明以及复杂声明的语法

    昨天刚把<C程序设计语言>中"指针与数组"章节读完,最终把心中的疑惑彻底解开了.如今记录下我对指针声明的理解.顺便说下怎样在C语言中创建复杂声明以及读懂复杂声明. 本文 ...

  6. 这样子来理解C语言中指针的指针

    友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指 ...

  7. 深入理解C语言 - 指针使用的常见错误

    在C语言中,指针的重要性不言而喻,但在很多时候指针又被认为是一把双刃剑.一方面,指针是构建数据结构和操作内存的精确而高效的工具.另一方面,它们又很容易误用,从而产生不可预知的软件bug.下面总结一下指 ...

  8. 通过实战理解C语言精要——函数篇

      前言 本篇博客是对C语言函数部分的重点内容和细枝末节通过实战得到的经验的总结精炼,不涵盖C语言函数的全部内容,所有提炼内容均来自提炼与实战,阅读需要对函数部分有一定基础,可用于对C语言函数的理解提 ...

  9. 如何理解vue.js组件的作用域是独立的

    vue.js组件的作用域是独立,可以从以下三个方面理解: 1.父组件模板在父组件作用域内编译,父组件模板的数据用父组件内data数据:2.子组件模板在子组件作用域内编译,子组件模板的数据用子组件内da ...

随机推荐

  1. ASP.NET MVC4网站搭建与发布【最新】

    ASP.NET MVC4网站搭建与发布 一些往事 2015年,仅仅大二的我怀着一颗创业之心,加入了常熟派英特,成为阳光职场平台的创始之一,并肩负了公司技术部的大梁,当时阳光职场正在从线下服务向互联网化 ...

  2. 吴裕雄--天生自然KITTEN编程:画三角形

  3. 将js进行到底:node学习9

    node.js数据库篇--Mongoose ODM 介绍mongoose 几乎所有的语言都有原生数据库连接驱动,这个我们上一回已经了解了,比如java的jdbc,mysql-connector,但是实 ...

  4. 腾讯玩O2O手机维修 巨头入局引市场大变

     巨头入局引市场大变" title="腾讯玩O2O手机维修 巨头入局引市场大变">     对于"游击队"或初创企业来说,最怕的就是巨头的杀入. ...

  5. 点击穿透bug · Jaywii

    微信点击穿透Bug 问题描述:在移动端为了去除点击延迟引入了fast-click,然而在房贷计算器的开发中遇到了这样一个bug,用户点击了select之后,微信在弹出选择器之后会瞬间因为约300ms的 ...

  6. js之构造函数的理解

    在JavaScript中,创建对象的方式包括两种:对象字面量和使用new表达式.对象字面量是一种灵活方便的书写方式,例如:   1 2 3 4 5 6 var o1 = {     p:”I’m in ...

  7. Tomcat8优化--Apache JMeter测试

    一.部署测试java web项目(压力测试环境搭建) 1.mysql环境 #切换到mysql目录 cd /usr/local/mysql #查看mysql环境 rpm -qa | grep -i my ...

  8. jquery 的animate 的transform

    $(function(){ var t = 1000; $("#id").animate( {borderSpacing:180}, //180 指旋转度数 { step: fun ...

  9. 【字节校招】【实习】【内推】字节跳动春招(校招或实习均可)以及日常实习内推ing

    本人是年前刚刚入职抖音的应届生,职业认证还未来的级更改,但是这些都不重要.重要的是我们不能错过优秀的你~ 字节跳动的相关福利我就不介绍了,技术实习生是400/天,房补是1500/月,三餐免费,下午茶, ...

  10. flask 对于用户登录保持状态 flask_login

    先加载flask_login ext.py  在app下的__init__.py 进行引用把,我就不写了 login_manager = LoginManager() # 如果没有登录则重定向到该蓝图 ...