如何在Go中使用Flag包

引言

命令行实用工具很少能在没有额外配置的情况下开箱即用。好的默认值很重要,但有用的工具需要接受用户的配置。在大多数平台上,命令行实用程序接受标志来定制命令的执行。标志是添加在命令名称之后的键值分隔的字符串。Go允许你使用标准库中的flag包来构建接受标志的命令行实用程序。

在本教程中,你将探索使用flag包构建不同类型的命令行实用程序的各种方法。你将使用一个标志来控制程序输出,引入位置参数来混合标志和其他数据,然后实现子命令。

使用标志来改变程序的行为

使用flag包涉及三个步骤:首先,[定义变量]以捕获标志值,然后定义您的Go应用程序将使用的标志,最后,在执行时解析提供给应用程序的标志。flag包中的大多数函数都是定义标志并将它们绑定到你已经定义的变量。解析阶段由Parse()函数处理。

为了说明这一点,我们将创建一个程序,它定义一个[Boolean]标志,改变打印为标准输出的消息。如果提供了-color标志,程序将打印一条蓝色的消息。如果没有提供标志,消息将不带任何颜色地打印。

创建一个名为boolean.go的新文件:

nano boolean.go

在该文件中添加以下代码来创建该程序:

boolean.go

package mainimport ("flag""fmt"
)type Color stringconst (ColorBlack  Color = "\u001b[30m"ColorRed          = "\u001b[31m"ColorGreen        = "\u001b[32m"ColorYellow       = "\u001b[33m"ColorBlue         = "\u001b[34m"ColorReset        = "\u001b[0m"
)func colorize(color Color, message string) {fmt.Println(string(color), message, string(ColorReset))
}func main() {useColor := flag.Bool("color", false, "display colorized output")flag.Parse()if *useColor {colorize(ColorBlue, "Hello, DigitalOcean!")return}fmt.Println("Hello, DigitalOcean!")
}

这个例子使用ANSI转义序列来指示终端显示彩色输出。这些是特殊的字符序列,因此为它们定义一个新类型是有意义的。在这个例子中,我们将该类型命名为Color,并将其定义为string。然后我们在接下来的const块中定义一个颜色调色板。在const代码块之后定义的colorize函数接受其中一个Color常量和一个string变量来对消息进行着色。它通过首先打印所要求的颜色的转义序列来指示终端改变颜色,然后打印消息,最后通过打印特殊的颜色重置序列来请求终端重置其颜色。

main中,我们使用flag.Bool函数来定义一个名为color的布尔值标志。该函数的第二个参数false用于在未提供此标志时设置其默认值。与你的预期相反,将其设置为true并不会使行为发生反转,即提供一个标志会导致它变为false。因此,这个参数的值几乎总是false,带有布尔值标志。

最后一个参数是一个文档字符串,可以作为使用消息打印出来。这个函数返回的值是一个指向bool的指针。下一行的flag.Parse函数使用此指针根据用户传递的标志设置bool变量。然后我们可以通过解引指针来检查这个bool指针的值。关于指针变量的更多信息可以在[指针教程]中找到。使用这个布尔值,我们可以在设置-color标志时调用colorize,并在标志不存在时调用fmt.Println变量。

保存文件,不带任何标志地运行程序:

go run boolean

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/222964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

swagger的ApiModelProperty设置字段的顺序

需求 让前端可以直接通过swagger就能知道各个字段是什么意思 如何配置 比如,我们设置了ApiModelProperty ApiModelProperty("用户主键")private Long userId;在swagger页面能直接看到注释 但是这个顺序是按照字母排序的,明显不符合我们的要…

在IDEA中使用Git 、远程仓库克隆工程到本地

4.1 在IDEA中配置Git 安装好IntelliJ IDEA后,如果Git安装在默认路径下,那么idea会自动找到git的位置,如果更改了Git的安装位置则需要手动配置下Git的路径。 选择File→Settings打开设置窗口,找到Version Control下的git选项&…

Java 基础学习(十)包装类、异常

1 包装类 1.1 包装类概述 1.1.1 什么是包装类 在进行类型转换时,有一种特殊的转换:将 int 这样的基本数据类型转换为对象,如下图所示: 所有基本类型都有一个与之对应的类,即包装类(wrapper)。…

使用ldflags为Go应用程序设置版本信息

引言 在将应用程序部署到生产环境中时,使用版本信息和其他元数据构建二进制文件将通过添加标识信息来帮助跟踪构建过程,从而改进监视、日志记录和调试过程。这个版本信息通常可以包括高度动态的数据,例如构建时间、构建二进制文件的机器或用户、构建二进制文件时使用的版本…

MATLAB基础应用精讲-【数模应用】神经网络(补充篇)

目录 前言 几个相关概念 反向传播 梯度下降 损失函数 优化函数

机器学习--归一化处理

归一化 归一化的目的 归一化的一个目的是,使得梯度下降在不同维度 θ \theta θ 参数(不同数量级)上,可以步调一致协同的进行梯度下降。这就好比社会主义,一小部分人先富裕起来了,先富带后富&#xff0c…

源码赏析: 数据结构转换工具 configor (一)

一、configor 先贴地址 configor,先看configor的特性: Header-only & STL-likeCustom type conversion & serializationComplete Unicode supportASCII & Wide-character support 说白了,这个工具用于自定义类型的转换和序列化…

微服务 Nacos服务注册与发现

一、Nacos 功能介绍 在微服务架构下,一个业务服务会被拆分成多个微服务,各个服务之间相互通信完成整体的功能。另外,为了避免单点故障,微服务都会采取集群方式的高可用部署,集群规模越大,性能也会越高&…

Flask 中的跨域难题:定义、影响与解决方案深度解析

跨域(Cross-Origin)是指在浏览器中,一个页面的脚本试图访问另一个页面的内容时发生的安全限制。Flask 作为一种 Web 应用框架,也涉及到跨域问题。本文将详细介绍跨域的定义、影响以及解决方案,涵盖如何在 Flask 中处理…

为什么需要分库分表,如何实现?

本文我们主要讲解“为什么需要分库分表,如何实现”。 在前文中讲到了读写分离,读写分离优化了互联网读多写少场景下的性能问题,考虑一个业务场景,如果读库的数据规模非常大,除了增加多个从库之外,还有其他…

WaitGroup并发控制原理及底层源码实现

WaitGroup并发控制原理及底层源码实现 1.1实现原理 1.2底层源码 type WaitGroup struct {noCopy noCopy// 64-bit value: high 32 bits are counter, low 32 bits are waiter count.// 64-bit atomic operations require 64-bit alignment, but 32-bit// compilers only guaran…

MSSQL存储过程的功能和用法

MSSQL(Microsoft SQL Server)的存储过程是一组SQL语句的集合,这些语句被预先编译并存储在数据库中,用于执行复杂的数据操作。以下是MSSQL存储过程的一些主要功能和用法: 功能: 数据操作:存储过程…

MySQL升级PostgreSQL遇到的常见问题及其解决方案

CRUD问题 选择 id 在的逗号分隔的字符串所表示的数组中的行 如果要将字符串用于连接条件,则需要将字符串转换为适当的整数数组。 Select * from table_name where id any(string_to_array(?, ,)::int[]);string_to_array(?, ,)::int[] 这部分代码的作用是将一…

态势感知是什么?在网络安全中有什么作用

态势感知是一种基于环境的、动态的、全面的洞察安全风险的能力。它以安全大数据为基础,从全局的角度,提高对安全威胁的发现识别、理解分析和处理反应能力。目的在于在大规模网络环境下,对能够引起网络态势变化的安全要素进行获取、理解、显示…

L1-041:寻找250

题目描述 对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。 输入格式: 输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。 输出格式: 在一行中…

程序员视角体验快速搭建智能客服中心

本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。 目录 前言基本概念工作原理浅试体验体验收获最后 前言 Amazon Connect是亚马逊云科技…

2 - Electron 核心概念

Electron 核心概念 主进程 通过Node.js、Electron提供的API与系统底层打交道启动项目时运行的 main.js 脚本就是我们说的主进程。在主进程运行的脚本可以以创建 Web 页面的形式展示 GUI。主进程只有一个 渲染进程 每个 Electron 的页面都在运行着自己的进程,这样…

检查字符串是否以指定的字符串结尾str.endswith()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 检查字符串是否以指定的字符串结尾 str.endswith() [太阳]选择题 请问以下代码输出的结果是? s "I love China!" print("【执行】print(s.endswith(!))") p…

Redis设计与实现之双端链表

目录 一、Redis为什么选择双端链表作为底层数据结构? 二、双端链表 1、双端链表的应用 实现Redis的列表类型 Note: Redis列表使用两种数据结构作为底层实现: Redis自身功能的构建 2、双端链表的实现 ​编辑3、迭代器 三、双端链表在Redis中的应用…

22. 常用shell之 chown - 更改文件所有者 的用法和衍生用法

chown 是 Unix 和类 Unix 系统(如 Linux 和 macOS)中用于更改文件或目录的所有者和所属组的命令。这个命令对于系统管理和文件权限管理至关重要。下面详细介绍 chown 的基本用法和一些衍生用法。 基本用法 chown 命令的基本语法如下: chow…