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语言作图,本节来讲讲当你拿到一个数据集的时候怎样下手分析,数据分析的第一步.探索性数据分析. 统计量,即统计学里面关注的数据集 ...
随机推荐
- HTML 和 CSS 基础
Contents hyper text markup language 超文本标记语言,是最基础的网页开发语言.网页文件后缀名以.html/.htm结束. 基本标签 文件标签 <!DOCTYPE ...
- qt creator源码全方面分析(3)
目录 项目文件分析 qtcreator.pro 包含qtcreator.pri Qt版本判断 包含doc.pri 源码组织架构 指定dist文件列表 qbs配置 指定架构和平台 指定基础名 指定lin ...
- Redis简单的数据操作(增删改查)
#Redis简单的数据操作(增删改查): 字符串类型 string 1. 存储: set key value 127.0.0.1:6379> set username zhangsan OK 2 ...
- 面试题57-II.和为s的连续正数序列
面试题57-II.和为s的连续正数序列 1.题目 LeetCode-面试题57-II.和为s的连续正数序列 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数 ...
- 前端劝退预警:JavaScript 工具链不完全指南
经过这么多年的发展,JavaScript 早已经不是当年那个不太起眼的脚本语言.如今的 JavaScript 可以说是风光无限,在 Web 前端.移动端.服务端甚至物联网设备上都大展身手,到处都有它的 ...
- SQLi-Labs之1~6关 - 常规注入与盲注
年初五 财神入 第一关 联合注入 1.准备 2.加'截断 3.order by 判断查询列数 4.同上 5.联合查询判断字段位置 6.查数据库名 7.1 查表名 7.2 查列名 8.查数据 第二关 不 ...
- OpenGL 实践之贝塞尔曲线绘制
说到贝塞尔曲线,大家肯定都不陌生,网上有很多关于介绍和理解贝塞尔曲线的优秀文章和动态图. 以下两个是比较经典的动图了. 二阶贝塞尔曲线: 三阶贝塞尔曲线: 由于在工作中经常要和贝塞尔曲线打交道,所以简 ...
- python虚拟环境安装使用
# 安装 pip install virtualenv pip install virtualenvwrapper-win # win环境下 liunx下不需要-win #创建一个文件夹并cd进去mk ...
- 五分钟学Java:如何才能学好Java Web里这么多的技术
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...
- Python离线项目迁移部署
最近遇到了一个场景:需要将Python项目文件打包到无法联网的主机上部署执行,本篇文章记录针对于该场景的处理方案. 说明: 源主机(可联网):安装了Python3和pip3 目标主机(无法联网):需安 ...