17.2 命令行-标志的类型、自定义帮助信息、子命令

1. 命令行标志的类型

针对标志值的每一种数据类型,flag包都提供了相对应的函数。

  • name := flag.String("name", "Anonymous", "Your name")

// 名字,字符串型

age := flag.Int("age", 20, "Your age") // 年龄,整型

female := flag.Bool("female", false, "You are female")

// 是否女性,布尔型

  • name、age和female的数据类型分别为*string、*int和*bool(返回的是指针,谨记)

布尔型标志,指定了取true,没指定取默认值,因此默认值应该为false。

  • main.exe -name Susan -age 30 -female
    • female -> true

                注:在此需要说明一下bool类型的标志及标志值的问题

                bool类型的参数有下面几种写法:

                --flag // 等同于 --flag==true

                --flag = value

                --flag value // 这种写法只有在没有设置默认值时才生效

  • main.exe -name George -age 40

                female -> false

//解析不同类型的命令行标志
// flag包为解析不同类型的命令行标志提供了不同的函数
package main
import ("flag""fmt"
)
func main() {name := flag.String("name", "Anonymous", "Your name")age := flag.Int("age", 20, "Your age")female := flag.Bool("female", false, "You are female")flag.Parse()fmt.Println("Your name is", *name)fmt.Println("Your age is", *age)if *female {fmt.Println("You are female")} else {fmt.Println("You are male")}
}
// 打印输出:PS > ./main.exe -name George -age 40Your name is GeorgeYour age is 40You are malePS > ./main.exe -name Susan -age 30 -femaleYour name is SusanYour age is 30You are female

 2. 自定义帮助信息

调用flag包的String、Int、Bool等函数时所提供的最后一个参数,将用于当用户输入错误或通过下列标志寻求帮助时,生成帮助信息。

  • -h
  • --h
  • -help
  • --help

如果将flag包导出变量Usage设置为一个函数,当用户输入错误或寻求帮助时,该函数将被调用。通过实现该函数,程序员可以自己定义帮助信息。

  • flag.Usage = func() {

                usageText := ... // 组织帮助信息字符串

                fmt.Fprintf(os.Stderr, "%s\n", usageText) // 将帮助信息输出到标准错误

        }

//显示自定义的帮助文本
// 用自己的实现覆盖flag包里的Usage函数,每当命令行
// 标志解析失败都会调用该函数,显示自定义的帮助信息
package mainimport ("flag""fmt""os"
)func main() {flag.Usage = func() {	// 为Usage自定义函数并赋值,实现自定义帮助文本fmt.Fprintf(os.Stderr,`Usage: %v [OPTION]
+---------+----------------+-----------+
| OPTION  | DESCRIPTION    | DEFAULT   |
+---------+----------------+-----------+
| -name   | Your name      | Anonymous |
| -age    | Your age       | 20        |
| -female | You are female | false     |
+---------+----------------+-----------+
`, os.Args[0])}name := flag.String("name", "Anonymous", "")age := flag.Int("age", 20, "")female := flag.Bool("female", false, "")flag.Parse()fmt.Println("Your name is", *name)fmt.Println("Your age is", *age)if *female {fmt.Println("You are female")} else {fmt.Println("You are male")}
}
// 打印输出:PS G:\GoWorkspace\src\cli\usage> ./main.exe --helpUsage: G:\GoWorkspace\src\cli\usage\main.exe [OPTION]+---------+----------------+-----------+| OPTION  | DESCRIPTION    | DEFAULT   |+---------+----------------+-----------+| -name   | Your name      | Anonymous || -age    | Your age       | 20        || -female | You are female | false     |+---------+----------------+-----------+ 

 3. 子命令

很多命令行程序都支持子命令,而每个子命令又带有自己的标志集,例如:

  • main.exe uppercase -l golang  // uppercase是子命令,-l是子命令标志名,golang是标志值,功能是将标志值转化为大写字符串。
  • main.exe lowercase -u GOLANG

flag包的NewFlagSet函数可用于创建针对特定子命令的标志集。

  • uppercase := flag.NewFlagSet("uppercase", flag.ExitOnError)
  • lowercase := flag.NewFlagSet("lowercase", flag.ExitOnError)

其中第一个参数为子命令名,第二个参数则指定了针对错误处理方式,其返回值是与第一个参数相对应的子命令的标志集。每个子命令对应的标志集是独立的。

  • ContinueOnError - 忽略错误,继续执行
  • ExitOnError - 出现错误,以状态码2退出
  • PanicOnError - 出现错误,引发恐慌

在获得针对每个子命令的标志集以后,再通过switch语句处理不同的子命令。

  • switch os.Args[1] { // 子命令名在Args切片中的下标是1,下标0是命令行程序文件路径
  • case "uppercase":
  •         处理uppercase子命令
  • case "lowercase":
  •         处理lowercase子命令
  • default:
  •         处理无效子命令
  • }
  • 注:hyperchain的main启动文件就是这么玩的。

针对每个子命令的处理,可以借助相应的标志集,以类似处理命令行标志的方法,根据标志名获取相应的标志值

  • l := uppercase.String("l", "hello world", "A string of text to be uppercased") // uppercase即为标志集,通过标志值来定义不同的处理方法;
  • uppercase.Parse(os.Args[2:]) // 子命令的参数在Args切片中的下标从2开始;
  • fmt.Println(strings.ToUpper(*l))
  • u := lowercase.String("u", "HELLO WORLD", "A string of text to be lowercased")
  • lowercase.Parse(os.Args[2:]) // Args切片中下标1对应的是子命令名
  • fmt.Println(strings.ToLower(*u))

对于无效子命令,可以简单地打印帮助信息

  • flag.Usage()
// 处理子命令
// flag包的NewFlagSet函数可创建独立标
// 志集,以用于解析子命令的命令行标志 
//
// 子命令标志集 = flag.NewFlagSet(子命令, 错误处理)
// switch os.Args[1] {
// case 子命令:
//     标志指针 = 子命令标志集.String(标志名, 默认值,
//         帮助文本)
//     子命令标志集.Parse(os.Args[2:])
//     子命令处理 
// default:
//     报告错误
// }
//   0    1    2    ...
// 命令 子命令 -标志名 标志值[默认值]
//                  ^
//                  |
//               标志指针 
package main
import ("flag""fmt""os""strings"
)
func main() {flag.Usage = func() {fmt.Fprintf(os.Stderr, `Usage: %v [COMMAND]
+-----------+--------------------+
| COMMAND   | DESCRIPTION        |
+-----------+--------------------+
| uppercase | Uppercase a string |
| lowercase | Lowercase a string |
+-----------+--------------------+
`, os.Args[0])}
if len(os.Args) < 2 {flag.Usage()return}uppercase := flag.NewFlagSet("uppercase",flag.ExitOnError)lowercase := flag.NewFlagSet("lowercase",flag.ExitOnError)switch os.Args[1] {case "uppercase":l := uppercase.String("l", "hello world","A string of text to be uppercased")uppercase.Parse(os.Args[2:])fmt.Println(strings.ToUpper(*l))case "lowercase":u := lowercase.String("u", "HELLO WORLD","A string of text to be lowercased")lowercase.Parse(os.Args[2:])fmt.Println(strings.ToLower(*u))default:flag.Usage()}
}
// 打印输出:
PS > ./main.exe uppercase -l golang GOLANGPS > ./main.exe lowercase -u GOLANGgolang 

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

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

相关文章

10款必备软件,每款都是神器,赶快用起来吧!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/最近有很多小伙伴在咨询&#xff0c;我也抓紧时间整理了一些不错的软件和我陆续收到的&#xff0c;希望对大家有所帮助。 1. 全球鼠标——MouseI…

vue2组件封装实战系列之space组件

组件之 GfSpace 多个同类型的内容比如 div/span/button/li 等&#xff0c;实现水平、垂直方向的均匀布局的功能 效果预览 属性 参数类型说明可选值默认值flexBoolean是否 flex 布局true/falsefalsegapNumber内容间距-10directionString内容排列方向row/columnrow 代码实现 这…

机器学习扩展包MLXtend绘制分类模型决策边界

公众号&#xff1a;尤而小屋编辑&#xff1a;Peter作者&#xff1a;Peter 大家好&#xff0c;我是Peter~ 继续更新机器学习扩展包MLxtend的文章。本文介绍如何使用MLxtend来绘制与分类模型相关的决策边界decision_regions。 导入库 导入相关用于数据处理和建模的库&#xff…

Debezium日常分享系列之:Debezium 2.7.0.Beta1发布

Debezium日常分享系列之&#xff1a;Debezium 2.7.0.Beta1发布 一、重大变化1.快照工件2.Oracle 二、新功能和改进1.在 z/OS 上支持 Db22.NATS JetStream 接收器身份验证改进3.JDBC 接收器 MariaDB 方言支持4.JMX 导出器添加到 Debezium 服务器5.使用 Debezium Operator 启用 J…

技术对比:eMMC、SD NAND与NOR Flash存储特性详解

在电子技术迅猛前进的今天&#xff0c;存储技术成为了整个行业发展的基石。SD NAND、eMMC和NOR Flash&#xff0c;这三种存储技术各自以其独特的架构和特性&#xff0c;满足了多样化的存储需求。让我们来看看它们之间的一些关键对比&#xff1a; 1. 存储单元架构&#xff1a; S…

Perfectly Clear WorkBench v4 解锁版安装教程 (图像修复增强工具)

前言 Perfectly Clear WorkBench 是一款图像修复工具&#xff0c;可以帮助用户对自己的图片素材进行修复&#xff0c;很多的照片因为拍摄问题&#xff0c;或者设备限制&#xff0c;会导致拍摄效果不好&#xff0c;使用这款软件可以进行一定程度的修复&#xff0c;当拍摄时亮度…

Ant Design+react 表单只读

表单禁用&#xff0c;样式不好看&#xff0c;不符合甲方标准&#xff0c;看了一下文档&#xff0c;select、radio等都不支持只读状态。 解决方法&#xff1a; 利用css3的point-events属性&#xff0c;设置为none 在查看弹窗时&#xff0c;传入一个变量&#xff0c;当变量为true…

了解光隔离器和光耦合器:主要区别和应用

光隔离器和光耦合器是现代电子电路中必不可少的组件&#xff0c;提供一项关键功能&#xff1a;电路不同部分之间的电气隔离。虽然它们在许多方面相似且经常互换使用&#xff0c;但两者之间存在明显差异&#xff0c;主要基于它们的工作电压能力。本文深入探讨了这些组件的基础知…

最新23道vue2+vue3面试题带答案汇总

文章目录 MVVM与MVC的区别Vue 2与Vue 3的主要区别Vue 3的优势Vue 2 是如何实现数据绑定的&#xff1f;Vue 2 中的 v-model 是如何工作的&#xff1f;Vue 2 的生命周期钩子有哪些&#xff1f;Vue 3 使用了什么技术来实现响应式系统&#xff1f;Vue 3 中的 Composition API 带来了…

windows系统内查看电脑SN号

cmd命令行模式下&#xff0c;输入代码wmic bios get serialnumber可以查看到当前计算机的SN号码

探索网络回溯分析系统与业务性能监控:提升IT运维效率的关键

目录 一、网络回溯分析系统的作用与优势 二、业务性能监控的重要性 三、提升网络性能的技巧与建议 结论 在现代企业中&#xff0c;网络的稳定性和业务的连续性至关重要。为了确保网络性能最佳化和快速解决故障&#xff0c;网络回溯分析系统和业务性能监控工具成为了IT运维的…

Python爬取与可视化-豆瓣电影数据

引言 在数据科学的学习过程中&#xff0c;数据获取与数据可视化是两项重要的技能。本文将展示如何通过Python爬取豆瓣电影Top250的电影数据&#xff0c;并将这些数据存储到数据库中&#xff0c;随后进行数据分析和可视化展示。这个项目涵盖了从数据抓取、存储到数据可视化的整个…

记一次Linux下Docker镜像服务器磁盘空间清理

我们开发环境Jenkins构建项目时报服务器磁盘空间不足&#xff0c;导致项目自动化构建部署失败&#xff0c; Docker镜像服务器磁盘空间清理我们做了多次了&#xff0c;之前在清理Docker镜像服务器时走了不少弯路&#xff0c;查了不少Docker镜像服务器空间清理&#xff0c;都大同…

循环嵌套语句的实际应用(2)

3199&#xff1a;【例33.2】 两位数 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 4565 通过数: 2573 【题目描述】 现在有一个两位数&#xff0c;这个两位数十位上的数与个位上的数和为 &#x1d44e; &#xff0c;十位上的数与个位上的数差&#xff08;大减小…

JAVA网络编程,反射及注解知识总结

文章目录 网络编程软件架构三要素IP端口号协议UDP协议发送数据接收数据三种通信方式 TCP协议客户端服务器端三次握手四次挥手 反射获取字节码文件获取构造方法获取成员变量获取成员方法反射的作用 动态代理注解作用格式使用位置注解的原理常见注解元注解自定义注解解析注解 网络…

每台云服务器最多可支持几块硬盘

每台云服务器最多可支持的硬盘数量取决于不同的因素&#xff0c;包括服务器的技术规格、硬盘的类型和尺寸、服务器架构和供应商的政策等。 在一般情况下&#xff0c;大部分云服务器都有多个硬盘插槽&#xff0c;以支持并行连接多个硬盘。现代服务器通常提供SATA、SAS和NVMe等接…

自然语言处理(NLP)—— 语言检测器

1. 文章概述 1.1 目的 在本篇文章中&#xff0c;我们将构建一个语言检测器&#xff0c;这是一个能够识别文本语言的简单分类器。这是一个能够识别文本是用哪种语言写的程序。想象一下&#xff0c;你给这个程序一段文字&#xff0c;它就能告诉你这是英语、法语还是其他语言。 …

MySQL实体类框架

实现mysql数据库的增删改查功能 import com.mchange.v2.collection.MapEntry; import lombok.Data; import org.junit.jupiter.api.Test;import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.*; import java.sql.*; …

返工 PCB 电路板的 6 个技巧

需要解决设计中的问题&#xff0c;例如&#xff1a; 您的原理图符号与 PCB 封装不一致&#xff08;这可能导致信号发送到错误的引脚&#xff09; 您选择了错误的电阻值。 你选择了错误的IC 您忘记在两个引脚之间进行必要的连接&#xff08;并且需要添加跳线&#xff09; 由…

Moonshot AI API使用(1)-获取MOONSHOT_API_KEY

Moonshot AI 开放平台 用户注册&#xff0c;使用微信扫码登录 把这个key复制下来