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语言库系列之flag的具体使用的文章就介绍到这了,更多相关Go flag内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Go语言中使用flag包对命令行进行参数解析的方法

    flag flag 是Go 标准库提供的解析命令行参数的包. 使用方式: flag.Type(name, defValue, usage) 其中Type为String, Int, Bool等:并返回一个相应类型的指针. flag.TypeVar(&flagvar, name, defValue, usage) 将flag绑定到一个变量上. 自定义flag 只要实现flag.Value接口即可: type Value interface { String() string Set(string)

  • golang flag简单用法

    通过一个简单的实例,来让大家了解一下golang flag包的一个简单的用法 package main import ( "flag" "strings" "os" "fmt" ) var ARGS string func main() { var uptime *bool = new(bool) flag.BoolVar(uptime,"u", false, "print system upti

  • Go语言库系列之flag的具体使用

    背景 终端(命令行)操作是程序员的必备技能,但是你知道怎么通过golang制作出如下命令吗? $ flag girl -h Usage of girl: -height int 身高 (default 140) $ flag girl --height 170 恭喜你获得了身高 170 的女朋友 极速上手 整个实现非常简单,只需要5个步骤 第一步,引库 import "flag" 第二步,定义变量 定义该变量的作用是存储命令行参数传来的值 var height int 第三步,配置命令

  • Go语言库系列之dotsql详解

    导读:能单独拎出SQL文件的某一行或几行执行,是不是非常有趣?今天我们来介绍一下这个有意思的库--dotsql. 背景介绍 dotsql不是ORM,也不是SQL查询语句的构建器,而是可以在一个SQL文件中拎出某几行来执行的工具,非常类似于ini配置文件的读取.如果还不理解,我们来看如下内容. -- name: create-users-table CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name VA

  • C语言递归系列的深入总结

    递归 什么是递归 递归简而言之就是函数自己调用自己 如图所示 但是递归并不是简简单单的自己调用自己的过程 它分为 传递 和 回归,传递就是橙色箭头 回归则是黑色箭头 这就是递归 以 计算阶乘为例,假设我们输入6 计算6的阶乘为例 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int factorial(int x) //递归体函数 { if (x == 1) { return 1; } return x * (factorial(x - 1

  • C语言库的封装和使用方法总结

    目录 前言 windows下静态库创建和使用 静态库的创建 静态库的使用 方法一:添加工程中 方法二:配置项目属性 方法三:使用编译语句 静态库优缺点 缺点 windows下动态库创建和使用 静态库中生成的.lib和动态库生成的.lib是不同的 __declspec(dllexport)是什么意思? 动态库的lib文件和静态库的lib文件的区别? 动态库的使用 方法一:隐式调用 方法二:添加工程中(如静态库的使用中方法一) 方法三:显式调用 总结 前言 库是已经写好的.成熟的.可复用的代码.在我

  • C语言数据结构系列队列篇

    目录 一.队列(Queue) 0x00队列的概念 0x01队列的结构 二.队列的定义 0x00链式队列 0x02 接口函数 三.队列的实现 0x00队列初始化(QueueInit) 0x01销毁队列(QueueDestroy) 0x02判断队列是否为空(HeapIsEmpty) 0x03入队(QueuePush) 0x04出队(QueuePop) 0x05 返回队头数据(QueueFront) 0x06 返回队尾数据(QueueBack) 0x07 求队列大小(QueueSize) 0x08完整

  • C语言数据结构系列篇二叉树的概念及满二叉树与完全二叉树

    链接:C语言数据结构系列之树的概念结构和常见表示方法 0x00 概念 定义:二叉树既然叫二叉树,顾名思义即度最大为2的树称为二叉树. 它的度可以为 1 也可以为 0,但是度最大为 2 . 一颗二叉树是节点的一个有限集合,该集合: ① 由一个根节点加上两颗被称为左子树和右子树的二叉树组成 ② 或者为空 观察上图我们可以得出如下结论: ① 二叉树不存在度大于 2 的节点,换言之二叉树最多也只能有两个孩子. ② 二叉树的子树有左右之分,分别为左孩子和右孩子.次序不可颠倒,因此二叉树是有序树. 注意:对

  • C语言数据结构系列篇二叉树的遍历

    目录 前言: Ⅰ. 定义二叉树 0x00二叉树的概念(回顾) 0x00定义二叉树 0x01 手动创建二叉树 Ⅱ. 二叉树的遍历 0x00关于遍历 0x01二叉树前序遍历 0x02二叉树中序遍历 0x03二叉树后序遍历 0x04层序遍历 前言: 学习二叉树的基本操作前,需要先创建一颗二叉树,然后才能学习其相关的基本操作,考虑到我们刚刚接触二叉树,为了能够先易后难地进行讲解,我们将暂时手动创建一颗简单的二叉树,用来方便大家学习.等二叉树结构了解的差不多后,后期我们会带大家研究二叉树地真正的创建方式.

  • Javascript公共脚本库系列(一): 弹出层脚本

    一.摘要 本系列文章是为了抽象通用的,跨浏览器的脚本方法. 本篇文章讲解弹出浮动层的javascript函数, 以及函数的原理和使用注意事项. 二.实现效果 用脚本弹出浮动层是我们最常用的脚本方法之一.下面是效果图:  点击图中的"航空公司"后,会在"航空公司"下面弹出浮动层. 在网上弹出框的脚本相当多, 而且还有各种第三方JS框架可供我们使用.但是其中有的脚本过于简单,仅仅粗略的实现弹出效果而忽略了灵活性,通用性和跨浏览器特性. 使用JS框架又有些杀鸡用牛刀.所以

  • 微信小程序 MinUI组件库系列之badge徽章组件示例

    MinUI是基于微信小程序自定义组件特性开发而成的一套简洁.易用.高效的组件库,适用场景广,覆盖小程序原生框架.各种小程序组件主流框架等,并且提供了高效的命令行工具.MinUI 组件库包含了很多基础的组件,其中 badge 徽章组件是一个很常用的基础元件, MinUI 中 badge 组件的效果图如下: 各式各样的类型都有哦,是不是看起来很方便很快捷的样子(^_^).可以打开微信扫一扫下面的小程序二维码先一睹为快: 下面介绍 badge 组件的使用方式. 1.使用下列命令安装 Min-Cli,如

  • C语言数据结构系列之树的概念结构和常见表示方法

    0x00 树的概念 树是一种非线性的数据结构,它是由 n(n >= 0)个有限节点组成的一个具有层次关系的集合. 那么为什么叫 "树" 呢? 我们之所以把它成为 "树",是因为它很像我们现实生活中的树.只是它是倒过来的,根朝上叶子朝下. 0x01 树的结构 ① 有一个特殊的节点,成为根节点,根节点不存在前驱节点. ② 除根节点外,其余节点被分成 M(M>0) 个互不相交的集合 T1.T2.…….Tm,期中没一个集合 Ti(1 <= i <=

随机推荐