Go语言库系列之flag
背景
终端(命令行)操作是程序员的必备技能,但是你知道怎么通过golang制作出如下命令吗?
$ flag girl -h
Usage of girl:
-height int
身高 (default 140)
$ flag girl --height 170
恭喜你获得了身高 170 的女朋友
极速上手
整个实现非常简单,只需要5个步骤
第一步,引库
import "flag"
第二步,定义变量
定义该变量的作用是存储命令行参数传来的值
var height int
第三步,配置命令信息
在main
函数或init
函数中加入
flag.IntVar(&height, "height", 140, "身高")
- 第一个参数是定义的变量引用
- 第二个参数:命令的名称
- 第三个参数:命令参数的默认值
- 第四个参数:命令的用法提示
第四步,解析参数
在main
函数中追加
flag.Parse()
第五步,打印变量
在main
函数中追加
fmt.Println("恭喜你获得了身高", height, "的女朋友")
大功告成,感兴趣的同学可以自行测试。
完整代码
package main
import (
"flag"
"fmt"
)
var height int
func main() {
flag.IntVar(&height, "height", 140, "身高")
flag.Parse()
fmt.Println("恭喜你获得了身高", height, "的女朋友")
}
高手进阶
支持多种执行方式
在终端执行时,以下几种传参方式都被支持
$ girl -height 170
$ girl --height 170
$ girl --height=170
$ girl -height=170
支持多种参数值类型
目前支持字符串、布尔、整型、浮点、时间等多种类型,完全该所有场景。
布尔类型支持多种写法
虽然布尔只有true
或false
,但写法却可以各种变种,非常骚气,支持的写法有
1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
隐式处理接收的参数值
如果我要悄悄地把传入身高减去5厘米怎么办?
第一步,定义一个height
类型
type height int
第二步,实现flag.Value
接口的两个方法
func (h *height) String() string {
return fmt.Sprint(*h)
}
func (h *height) Set(value string) error {
valueInt, _ := strconv.Atoi(value)
*h = height(valueInt - 5)
return nil
}
String
方法用于格式化值,Set
方法用于处理变量设置时候的逻辑。
第三步,定义height类型变量
var heightFlag height
第四步,主函数配置及解析
func main() {
flag.Var(&heightFlag, "height", "身高")
flag.Parse()
fmt.Println(heightFlag)
}
代码与极速上手中的主函数内容大致相同,只是调用了flag.Var
方法,该方法不需要传入默认值。
感谢大家的观看,如果觉得文章对你有所帮助,欢迎关注公众号「平也」,聚焦Go语言与技术原理。
Go语言库系列之flag的更多相关文章
- Go语言库系列之aurora
背景介绍 今天跟大家推荐一款可以给终端输出上色的工具--aurora. 极速上手 准备工作 初始化项目 go mod init aurora 演示项目结构 . ├── go.mod ├── go.su ...
- Go语言库系列之email
导读 大家好我是平也,今天跟大家介绍一款用来发送邮件的Go语言库email,目前星星1.3k,非常好用. 极速上手 准备工作 初始化项目 go get github.com/jordan-wright ...
- Go语言库系列之dotsql
导读:能单独拎出SQL文件的某一行或几行执行,是不是非常有趣?今天我们来介绍一下这个有意思的库--dotsql. 背景介绍 dotsql不是ORM,也不是SQL查询语句的构建器,而是可以在一个SQL文 ...
- ElasticSearch 2 (23) - 语言处理系列之词根提取
ElasticSearch 2 (23) - 语言处理系列之词根提取 摘要 世界上大多数语言都是屈折变化的,意思是词语可以通过变形来表达不同的含义: 数(Number): fox, foxes 时态( ...
- ElasticSearch 2 (21) - 语言处理系列之单词识别
ElasticSearch 2 (21) - 语言处理系列之单词识别 摘要 一个英语单词相对容易识别:因为英语单词是被空格或(某些)标点符号隔开的.但在英语中也有反例:you're 这个词是一个单词还 ...
- ElasticSearch 2 (20) - 语言处理系列之如何开始
ElasticSearch 2 (20) - 语言处理系列之如何开始 摘要 Elasticsearch 配备了一组语言分析器,为世界上大多数常见的语言提供良好的现成基础支持. 阿拉伯语.亚美尼亚语,巴 ...
- 【Go语言入门系列】Go语言工作目录介绍及命令工具的使用
[Go语言入门系列]前面的文章: [保姆级教程]手把手教你进行Go语言环境安装及相关VSCode配置 [Go语言入门系列](八)Go语言是不是面向对象语言? [Go语言入门系列](九)写这些就是为了搞 ...
- Linux C C语言库的创建和调用
C语言库的创建和调用 简介: 假如,你有一个庞大的工程,代码量达到数百兆甚至是数G,你经常会遇到好多重复或常用的地方.每次使用到这些地方时如果都重新写一份基本相同的代码,这当然可以,不过这样会大大地降 ...
- R语言数据分析系列六
R语言数据分析系列六 -- by comaple.zhang 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候怎样下手分析,数据分析的第一步.探索性数据分析. 统计量,即统计学里面关注的数据集 ...
随机推荐
- Python——13定制类
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——55(项目一3、分数类的重载、>>
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- pem文件转换pub
security CRT在key登陆的时候只能使用.pub文件,所以需呀将.pem转换成.pub 生成公密钥 .pub 文件.ssh-keygen -e -f key.pem >> key ...
- sql -- 多表关联,update(用户奖励)
表设计: users_buy: users_score: 需求: 1.根据用户分组,找出用户消费最高的金额 select user_name, max(paymoney) as pm from use ...
- VirtualBox Ubuntu设置静态ip亲测可行
virtualbox重启后ip会自动分配,不固定.项目中需要配置ip地址,因此每次ip换了,需要重新配置和编译. 网上搜罗好几种方法进行配置,尝试下面这种简单并且可行: 步骤一:查看虚拟机网卡 ifc ...
- Java enum枚举在实际项目中的常用方法
在项目实际开发过程中,经常会遇到对某些固定的值.字典项的定义的需求,很多项目经常使用常量来定义,其实在jdk1.5就已经引入了枚举,使用枚举可以更好的解决这类需求,本文主要记录枚举的优势以及经常在项目 ...
- Azure Devops/TFS测试管理(下)
紧接着 上篇 经过上篇折腾,我们已经有了: ①手工测试的流程规范 ②测试用例的管理 对于开发出身的我,我觉得一个项目上线流程应该主要瓶颈只能是开发本身,因为我认为最复杂过程应该就是开发,而肯定不能是测 ...
- 在shell脚本中调用sql语句
查询员工信息 -S:静默登录 [oracle@localhost shells]$ cat shell1.sh #!/bin/bash #查询员工信息 sqlplus -S /nolog <&l ...
- Pytorch-Tensor基本操作
(此文为个人学习pytorch时的笔记,便于之后的查询) Tensor基本操作 创建tensor: 1.numpy向量转tensor: a=np.array([2,2,2]) b=torch.fr ...
- SpringBoot突报java.lang.NoSuchFieldError分析
SpringBoot项目,引了一个内部的工具包,竟然导致启动失败,报找不到freemarker Configuration类的一个属性,网上的解法都大同小异,最终用了自己的办法解决,花点时间记录下来, ...