背景

终端(命令行)操作是程序员的必备技能,但是你知道怎么通过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

支持多种参数值类型

目前支持字符串、布尔、整型、浮点、时间等多种类型,完全该所有场景。

布尔类型支持多种写法

虽然布尔只有truefalse,但写法却可以各种变种,非常骚气,支持的写法有

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的更多相关文章

  1. Go语言库系列之aurora

    背景介绍 今天跟大家推荐一款可以给终端输出上色的工具--aurora. 极速上手 准备工作 初始化项目 go mod init aurora 演示项目结构 . ├── go.mod ├── go.su ...

  2. Go语言库系列之email

    导读 大家好我是平也,今天跟大家介绍一款用来发送邮件的Go语言库email,目前星星1.3k,非常好用. 极速上手 准备工作 初始化项目 go get github.com/jordan-wright ...

  3. Go语言库系列之dotsql

    导读:能单独拎出SQL文件的某一行或几行执行,是不是非常有趣?今天我们来介绍一下这个有意思的库--dotsql. 背景介绍 dotsql不是ORM,也不是SQL查询语句的构建器,而是可以在一个SQL文 ...

  4. ElasticSearch 2 (23) - 语言处理系列之词根提取

    ElasticSearch 2 (23) - 语言处理系列之词根提取 摘要 世界上大多数语言都是屈折变化的,意思是词语可以通过变形来表达不同的含义: 数(Number): fox, foxes 时态( ...

  5. ElasticSearch 2 (21) - 语言处理系列之单词识别

    ElasticSearch 2 (21) - 语言处理系列之单词识别 摘要 一个英语单词相对容易识别:因为英语单词是被空格或(某些)标点符号隔开的.但在英语中也有反例:you're 这个词是一个单词还 ...

  6. ElasticSearch 2 (20) - 语言处理系列之如何开始

    ElasticSearch 2 (20) - 语言处理系列之如何开始 摘要 Elasticsearch 配备了一组语言分析器,为世界上大多数常见的语言提供良好的现成基础支持. 阿拉伯语.亚美尼亚语,巴 ...

  7. 【Go语言入门系列】Go语言工作目录介绍及命令工具的使用

    [Go语言入门系列]前面的文章: [保姆级教程]手把手教你进行Go语言环境安装及相关VSCode配置 [Go语言入门系列](八)Go语言是不是面向对象语言? [Go语言入门系列](九)写这些就是为了搞 ...

  8. Linux C C语言库的创建和调用

    C语言库的创建和调用 简介: 假如,你有一个庞大的工程,代码量达到数百兆甚至是数G,你经常会遇到好多重复或常用的地方.每次使用到这些地方时如果都重新写一份基本相同的代码,这当然可以,不过这样会大大地降 ...

  9. R语言数据分析系列六

    R语言数据分析系列六 -- by comaple.zhang 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候怎样下手分析,数据分析的第一步.探索性数据分析. 统计量,即统计学里面关注的数据集 ...

随机推荐

  1. 作为前端,你需要懂得javascript实现继承的方法

    在ES6之前,javascript不跟其他语言一样,有直接继承的方法,它需要借助于构造函数+原型对象模拟实现继承.现在我们可以利用ES6的extends方法实现继承,如果想了解更多有关ES6实现的继承 ...

  2. py基础之数据类型及基本语法

    '''python中有五种数据类型,分别是整数.浮点数.字符串.布尔值.空值'''a = 1b = 2.0c = 'hello,world'print (a,b,c)#a是整数,b是浮点数,c是字符串 ...

  3. flask之三:视图高级

    视图高级 app.route和app.add_url_rule app.add_url_rule app.add_url_rule('/list/',endpoint='myweb',view_fun ...

  4. python之路-基本数据类型之list列表

    1.概述 列表是python的基本数据类型之一,是一个可变的数据类型,用[]方括号表示,每一项元素使用逗号隔开,可以装大量的数据 #先来看看list列表的源码写了什么,方法:按ctrl+鼠标左键点li ...

  5. javascript设计模式和开发实践(阶段一)

    1,设计模式的作用:让人们写出可复用和可维护性高的程序,代价可能是,额外增加代码量: 比较形象的例子:空房间里面放东西,如果日复一日的往里面扔东西,时间久了,很难找到自己想要的东西,调整也不容易,但是 ...

  6. 详细解析kafka之kafka分区和副本

    本篇主要介绍kafka的分区和副本,因为这两者是有些关联的,所以就放在一起来讲了,后面顺便会给出一些对应的配置以及具体的实现代码,以供参考~ 1.kafka分区机制 分区机制是kafka实现高吞吐的秘 ...

  7. 迄今为止最硬核的「Java8时间系统」设计原理与使用方法

    为了使本篇文章更容易让读者读懂,我特意写了上一篇<任何人都需要知道的「世界时间系统」构成原理,尤其开发人员>的科普文章.本文才是重点,绝对要读,走起! Java平台时间系统的设计方案 几乎 ...

  8. 2020年ubuntu sever1804 安装和配置

    最后一次折腾linux服务器,应该是13的我的VPS.因为转行后,没有及时关注vps续费的问题,结果过期,所有的数据丢失了 当时觉得,反正都不做了,丢了就丢了吧,可现在想起来,实在是太后悔了. 今天, ...

  9. Python1-变量

    一.变量和简单数据类型 1.变量 命名规则: 变量名组成——字母.下划线.数字(不可做首字符): 用下划线分隔单词,不可包含空格: 关键字和函数名不可做变量名: 小写字母做变量名,不建议使用大小写的字 ...

  10. 给萌新的 TS custom transformer plugin 教程——TypeScript 自定义转换器插件

    xuld/原创 Custom transformer (自定义转换器)是干什么的 简单说,TypeScript 可以将 TS 源码编译成 JS 代码,自定义转换器插件则可以让你定制生成的代码.比如删掉 ...