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语言作图,本节来讲讲当你拿到一个数据集的时候怎样下手分析,数据分析的第一步.探索性数据分析. 统计量,即统计学里面关注的数据集 ...
随机推荐
- 用java实现的微信公众号爬虫
Published: 2016-11-23 In Spider. tags: Spider 版权声明:本文为博主原创文章,未经博主允许不得转载. 思路: 直接从chuansong.me爬取,由于微信公 ...
- Kubernetes搭建过程中使用k8s.gcr.io、quay.io、docker.io的镜像加速
前言 因为众所周知的原因,在使用Kubernetes和docker的时候会出现一些镜像无法拉取或者速度较慢的情况,错误信息类似以下: [ERROR ImagePull]: failed to pull ...
- 达拉草201771010105《面向对象程序设计(java)》第十七周学习总结
达拉草201771010105<面向对象程序设计(java)>第十七周学习总结 第一部分:理论知识 1.多线程的概念: (1)多线程是进程执行过程中产生的多条执行线索. (2)多线程意味着 ...
- MyBatis配置文件中config与mapper的约束
本文链接:https://blog.csdn.net/gaoxin_gx/article/details/100183455 Config的约束: <?xml version="1.0 ...
- 使用HBuilder开发移动APP:开发环境准备(转)
一直想开发个APP玩玩的,但是作为一个PHP码农,需要新学习JAVA或者Object C,这也是一直没能实现这个目标的原因.但是现在HTML5+.APPCAN.apicloud很多工具利用前端技术就能 ...
- 仿segmentfault-table横向滚动
问题描述 自己的博客在用移动端访问时,如果table的列数足够多会显示不全,如下图红圈所示 正常情况如图 解决过程 使用chrome发现segmentfault的解决方法是在table上套一个tabl ...
- Java基础--Java基本数据类型
一.基本数据类型(primitive type) (1)数值型 1.数值型包括整数类型(byte,short,int,long) a.byte :1字节=8bit位 (-128~127) 包装类: ...
- Cinemachine简介
先贴一下官方的Cinemachine文档Cinemachine Documentation 简介 使用 我们第一次使用Cinemachine时大概是这样一个流程: 在需要被控制的Camera上 ...
- Git使用ssh公钥
Git使用ssh公钥 一. 何谓公钥 1.很多服务器都是需要认证的,ssh认证是其中的一种.在客户端生成公钥,把生成的公钥添加到服务器,你以后连接服务器就不用每次都输入用户名和密码了. 2.很多gi ...
- 开篇词The Start以及[Vjudge][HDU2242]空调教室
开篇 这是我写的第一篇记录好题的博客,也是博客园上我发布的第一篇博客. 以后我的所有博客都将在洛谷和博客园上同时发布,同志们有兴趣的在哪里都可以看一看. [https://www.luogu.com. ...