Go标准包之flag命令行参数解析

1.介绍

在 Go中,如果要接收命令行参数,需要使用 flag
包进行解析。不同的参数类型可以通过不同的方法接收。

2.参数接受

2.1 接受方式

使用flag接收参数,可以由以下三种方式接受:

  • 方式一: flag.Type(name,defaultVal,desc)
  • 方式二: flag.TypeVar(&flagVar,name,defaultVal,desc)
  • 方式三: flag.Var(&flagVar,name,desc)
  • 方式四: flag.Args()
  • 方式五:flag.Arg(i)
    在这里插入图片描述

2.2 注意事项

  • 上面接收方式一、二、三,都是最后调用flag.Parse(),而方式四和方式五是提前调用flag.Parse()。
  • 方式一、二、三传参时,注意布尔类型,尽量设置成-flag=val,否则会影响后面的参数解析。
  • 方式四、五不能使用-flag=val这种格式传参。

3.flag.Type

3.1 代码

在这里插入图片描述

package main
import (
 "flag"
 "fmt"
)
var (
 // 接收字符串
 str =  flag.String("name","默认名","用户姓名")
 // 接收整型
 age = flag.Int("age",18,"用户年龄")
 // 接收布尔型
 smoking = flag.Bool("smoking",false,"是否吸烟")
)
func main()  {
 // 解析
 flag.Parse()
 fmt.Printf("str: %v\n",*str)
 fmt.Printf("age: %v\n",*age)
 fmt.Printf("smoking: %v\n",*smoking)
}

3.2 编译运行

在这里插入图片描述

# 编译
➜ go build main.go
# 运行(不传参数时)
➜ ./main                                  
str: 默认名
age: 18
smoking: false

# 运行(传参数时)
➜ /main -name 张三 -age 100 -smoking=true
str: 张三
age: 100
smoking: true

4.flag.TypeVar

4.1 代码

在这里插入图片描述


package main
import (
 "flag"
 "fmt"
)
// 先定义变量
var (
 name string
 age int
 smoking bool
 weight float64
)
func main()  {
 // 接收字符串
 flag.StringVar(&name,"name","默认名字","用户名")
 // 接收整型
 flag.IntVar(&age,"age",18,"用户年龄")
 // 接收布尔类型
 flag.BoolVar(&smoking,"smoking",false,"是否吸烟?")
 // 接收浮点型
 flag.Float64Var(&weight,"w",60.0,"体重")
 // 解析
 flag.Parse()
 fmt.Printf("姓名: %v\n",name)
 fmt.Printf("年龄: %v\n",age)
 fmt.Printf("是否吸烟?: %v\n",smoking)
 fmt.Printf("体重: %v\n",weight)
}

4.2 编译运行

在这里插入图片描述

# 编译
➜ go build main.go

# 运行(不传参数时)
➜  ./main                                  
姓名: 默认名字
年龄: 18
是否吸烟?: false
体重: 60
# 运行(传参数时)
➜ ./main -name 张三 -age 22 -smoking=true  -w=88.9
姓名: 张三
年龄: 22
是否吸烟?: true
体重: 88.9

4.3 细节

在传参数过程中,发现布尔型传参如果不设置=,会影响后面的参数接收,具体如下:
在这里插入图片描述

# 布尔型不设置 = (发现名字没有被接收)
➜  gin-use git:(dev) ✗ ./main -smoking true -name 哈哈                   
姓名: 默认名字
年龄: 18
是否吸烟?: true
体重: 60

# 布尔型设置 = 
➜  gin-use git:(dev) ✗ ./main -smoking=true -name 哈哈
姓名: 哈哈
年龄: 18
是否吸烟?: true
体重: 60

5.flag.Var

通过 flag.Var()绑定自定义类型,自定义类型需要实现 Value接口(Receives必须为指针)

5.1 代码

在这里插入图片描述

package main

import (
 "flag"
 "fmt"
 "strings"
)
// 自定义变量,并实现flag.Value接口
type Likes []string
func (l *Likes) String() string {
 return fmt.Sprintf("%v",*l)
}
func (l *Likes)Set(s string) error  {
 // 分割字符串
 split := strings.Split(s, ",")
 *l = split
 return nil
}
func main() {
 var likeList Likes
 // 接收自定义类型
 flag.Var(&likeList,"likes","接收自定义类型")
 // 解析
 flag.Parse()
 fmt.Println(likeList)
}

5.2 编译运行

在这里插入图片描述

# 编译
➜  go build main.go 
# 运行
➜  ./main -likes=篮球,足球,游戏
[篮球 足球 游戏]

6.flag.Args

一次打印出全部的入参,注意入参格式不能是-flag=val格式。

6.1 代码

在这里插入图片描述

package main
import (
 "flag"
 "fmt"
)
func main() {
 // 注意Parse是在Args之前调用
 flag.Parse()
 // 一次接收所有的参数
 args := flag.Args()
 fmt.Println(args)
}

6.2 编译运行
在这里插入图片描述

# 编译
➜  go build main.go 
# 错误入参示例
➜  ./main -name=张三 -age=18 -sex=男  
flag provided but not defined: -name
Usage of ./main:
# 正确入参示例
➜ ./main 张三 18[张三 18]

7.flag.Arg(i)

获取指定索引位置的参数,默认索引位置是0;注意入参格式不能是-flag=val格式。

7.1 代码

在这里插入图片描述

package main
import (
 "flag"
 "fmt"
)
func main() {
 // 注意Parse是在Arg之前调用
 flag.Parse()
 // 获取指定索引位置参数
 p0 := flag.Arg(0)
 p1 := flag.Arg(1)
 p2 := flag.Arg(2)
 fmt.Printf("索引=0,v=%v\n",p0)
 fmt.Printf("索引=1,v=%v\n",p1)
 fmt.Printf("索引=2,v=%v\n",p2)
}

7.2 编译运行
在这里插入图片描述

# 编译
➜  go build main.go 
# 传参
➜  ./main 张三 18 男  
索引=0,v=张三
索引=1,v=18
索引=2,v=

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux上使用HTTP协议进行数据获取的实战示例

嗨,Linux爱好者们,今天我们要一起探讨一下如何在Linux上进行HTTP协议的数据获取。这不是一项简单的任务,但放心,我会以最简单的语言,结合实例来给大家讲解。 首先,我们需要一个工具,那就是curl…

Python生成器(Generator)(继续更新...)

学习网页: Welcome to Python.orghttps://www.python.org/https://www.python.org/ Python生成器 生成器(Generator)是 Python 的一种特殊类型的迭代器。生成器允许你创建自己的数据流,每次从数据流中获取一个元素,…

医保电子凭证在项目中的集成应用

随着医保电子凭证使用普及,医疗行业的各个场景都要求支持医保码一码通办,在此分享一下,在C#和js中集成医保电子凭证的demo 供有需要的小伙伴参考。 一、项目效果图 在c#中集成医保电子凭证效果 在js中集成医保电子凭证效果 二、主要代码 c#…

Linux_Docker图形化工具Portainer如何安装并结合内网穿透实现远程访问

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 本文主要介绍如何本地安装Portainer并结合内网穿透工具实现任意浏览器远程访问管理界面。Portainer 是一个轻量级…

算法竞赛备赛进阶之树形DP训练

目录 1.树的最长路径 2.树的中心 3.数字转换 4.二叉苹果树 5.战略游戏 6.皇宫守卫 树形DP是一种动态规划方法,主要用于解决树形结构的问题。在树形DP中,通常会使用动态规划的思想来求解最优化问题。其核心在于通过不断地分解问题和优化子问题来解决…

【理论篇】SaTokenException: 非Web上下文无法获取Request问题解决 -理论篇

在我们使用sa-token安全框架的时候,有时候会提示:SaTokenException:非Web上下文无法获取Request 错误截图: 在官方网站中,查看常见问题排查: 错误追踪: 跟着源码可以看到如下代码: 从源码中&a…

01 整体代码运行流程

文章目录 01 整体代码运行流程1.1 运行官方 Demo1.2 变量命名规则1.3 多线程1.4 线程锁1.5 SLAM 主类 System 01 整体代码运行流程 1.1 运行官方 Demo 以 stereo_kitti 为例,执行 ./stereo_kitti path_to_vocabulary path_to_settings path_to_sequence./stereo_…

大创项目推荐 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数:2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

W25Q64(模拟SPI)读写数据的简单应用

文章目录 一、W25Q64是什么?二、使用步骤1.硬件1.引脚说明2.硬件连接3.设备ID4.内部框架5.指令集指令集1指令集2 2.软件1.W25Q64引脚定义代码如下(示例):2.W25Q64初始化代码如下(示例):3.W25Q64…

在排序数组中查找元素的第一个和最后一个位置(Java详解)

一、题目描述 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示…

Android开发——组合函数、注解与连接Android设备

1、JetPack Compose、组合函数与注解和文本修改 1、JetPack Compose:Jetpack Compose 是由 Google 推出的用于构建 Android 用户界面的现代化工具包。它是一个声明式的 UI 工具包,用于简化 Android 应用程序的用户界面设计和开发。Jetpack Compose 采用…

02.Git常用基本操作

一、基本配置 (1)打开Git Bash (2)配置姓名和邮箱 git config --global user.name "Your Name" git config --global user.email "Your email" 因为Git是分布式版本控制工具,所以每个用户都需要…

02-分组查询group by和having的使用

分组查询 MySQL中默认是对整张表的数据进行操作即整张表为一组, 如果想对每一组的数据进行操作,这个时候我们需要使用分组查询 分组函数的执行顺序: 先根据where条件筛选数据,然后对查询到的数据进行分组,最后也可以采用having关键字过滤取得正确的数据 group by子句 在一条…

【STM32】STM32学习笔记-EXTI外部中断(11)

00. 目录 文章目录 00. 目录01. 中断系统02. 中断执行流程03. STM32中断04. NVIC基本结构05. NVIC优先级分组06. EXTI简介07. EXTI基本结构08. AFIO复用IO口09. EXTI框图10. 计数器模块11. 旋转编码器简介12. 附录 01. 中断系统 中断:在主程序运行过程中&#xff0…

easy贪吃蛇

之前承诺给出一个贪吃蛇项目。 1.EasyX库认知 有关EasyX库的相关信息,您可以看一下官方的文档:EasyX官方文档。 这里我做几点总结: EasyX库就和名字一样,可以让用户调用一些简单的函数来绘制图像和几何图形利用EasyX库可以制作…

ES6 面试题 | 15.精选 ES6 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

知识付费平台选择指南:如何找到最适合你的学习平台?

在当今的知识付费市场中,用户面临的选择越来越多,如何从众多知识付费平台中正确选择属于自己的平台呢?下面,我们将为您介绍我有才知识付费平台相比同行的优势,帮助您做出明智的选择。 一、创新的技术架构,…

3.3【窗口】窗口的几何形状(二,窗口属性)

写在前面 应用程序使用窗口来显示内容。一些属性决定了窗口及其内容的大小和位置。其他属性决定了窗口内容的外观和解释。 了解窗口属性引用的两个坐标系非常重要。如果你知道你正在使用的坐标系,那么为你的窗口属性选择设置值会容易得多,并且会更有意义。 一,显示相关属…

【CMU 15-445】Lecture 11: Joins Algorithms 学习笔记

Joins Algorithms Nested Loop JoinNaive Nested Loop JoinBLock Nested Loop JoinIndex Nested Loop Join Sort-Merge JoinHash JoinBasic Hash JoinPartitioned Hash Join Conclusion 本节课主要介绍的是数据库系统中的一些Join算法 Nested Loop Join Naive Nested Loop Joi…

华媒舍:打造出色科普文章的10步路透社发稿手册

1.科普文章的编写是一项让科技知识更为浅显易懂重要工作。下面我们就详细介绍路透社的发稿手册,带来了好用的流程,协助作者从零开始创作出色的科普文章。 2.明确主题风格在创作科普文章以前,首先要明确要介绍的主题风格。选择一个有趣且适合…