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

news2024/11/27 10:02:01

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=

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

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

相关文章

Python查看模块(变量、函数、类)方法

在导入模块之后,开发者往往需要了解模块包含哪些功能,比如包含哪些变量、哪些函数、哪些类等,还希望能查看模块中各成员的帮助信息,掌握这些信息才能正常地使用该模块。 为了查看模块包含什么,可以通过如下两种方式&a…

Discord Midjourney 安装使⽤教程(AI绘画)

安装步骤: 1.注册Discord账号 2.进⼊Midjourney社区创作 3.创建⾃⼰服务器 安装教程: 1.注册Discord账号 账号注册的方式: 注册地址: //账号注册地址https://discord.com/ 2.进⼊Midjourney社区创作 // 邀请链接: 官方的midjourneyhttps://discord.gg/midjo…

〖大前端 - 基础入门三大核心之JS篇(56)〗- 内置构造函数

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:哈哥撩编程,十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司…

gitlab(gitlab-ce)下载,离线安装

目录 1.下载 2.安装 3.配置 4.启动 5.登录 参考: 1.下载 根据服务器操作系统版本,下载对应的RPM包。 gitlab官网: The DevSecOps Platform | GitLab rpm包官网下载地址: gitlab/gitlab-ce - Results in gitlab/gitlab-ce 国内镜像地…

全球移动通信(2G/3G/4G/5G)频谱分布情况

一、概述 随着通信技术的不断发展,全球各国都在积极推进2G、3G、4G、5G网络的建设和应用。根据FCC统计,目前全球移动通信频谱分布如下: 二、分布 (一)俄罗斯 2G:主要使用900MHz和1800MHz两个频段。其中&…

【Stm32-F407】全速DAP仿真器下载程序

文章内容如下: 1) 全速DAP仿真器简介2) 全速DAP仿真器下载程序流程 1) 全速DAP仿真器简介 1)全速DAP仿真器简介 DAP全称 Data Acquisition Processor,是一种用于数据采集和实时控制的设备。本文使用的全速DAP仿真器遵循ARM公司的CMSIS-DAP标准&#xff…

MySQL数据库 函数

目录 函数概述 字符串函数 数值函数 日期函数 流程函数 函数概述 函数是指一段可以直接被另一段程序调用的程序或代码。也就意味着,这一段程序或代码在MysQL中已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即…

使用hackrf one采集Lora信号

使用osmocom Source模块 使用osmocom Source模块来接收来自软件定义无线电设备(如HackRF One)的信号使用file Sink模块 用于将流程图中的数据保存到文件中。它的作用是将数据写入磁盘,以便后续进行离线分析、处理或存档。使用WX GUI Scope Si…

Java小案例-RocketMQ的11种消息类型,你知道几种?(死信消息)

前言 在RocketMQ中,死信消息(Dead-Letter Message)是指那些在正常情况下无法被消费者消费的消息。这些消息会被存储在死信队列(Dead-Letter Queue,简称DLQ)中。 死信消息的特性包括: 不会再被…

今天面了一个来阿里要求月薪21K的,明显感觉他背了很多面试题.....

最近有朋友去阿里面试,面试前后进行了20天左右,包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说,80%的人都会栽在第一轮面试,要不是他面试前做足准备,估计都坚持不完后面几轮面试。 其实&…

Python基础教程——项目的组织结构:包、模块、类、函数(实例)!

01 几个重要的概念 1.1 包:可以简单的理解为文件夹的概念 注解:包package是一个文件夹(目录),里面包含__init__.py和模块; 1.2 模块:简单的理解为 .py文件 注解:模块module是文件&…

亚信科技AntDB数据库——深入了解AntDB-M元数据锁的实现(一)

锁的获取 5.1 锁的强弱 当线程已经持有的锁比新申请的锁更强时,认为已经持有了锁,无需再对申请锁类型加锁。锁的强弱指持有的锁与其他锁的不兼容集合大小,集合相同锁相同,集合更大锁更强,否则无强弱关系。通过锁的兼…

Python---多任务的介绍

1. 提问 利用现学知识能够让两个函数或者方法同时执行吗? 不能,因为之前所写的程序都是单任务的,也就是说一个函数或者方法执行完成另外一个函数或者方法才能执行,要想实现这种操作就需要使用多任务。 多任务的最大好处是充分利用CPU资源&…

后端相关随机题目记录(1)

目录 后端相关随机题目记录(1) 后端相关随机题目记录(1)Bean的类型以及作用域Bean的生命周期Mysql的底层数据结构RedisHttp和Https区别AOP在项目的应用 自定义注解?请求在spring中的一个流程Nacos与zk的区别SpringMV…

八.创建和管理表

目录 1. 基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 MySQL中的数据类型 2. 创建和管理数据库2.2 使用数据库2.3 修改数据库 3. 创建表3.1 创建方式13.2 创建方式23.4 查看数据表结构 4. 修改表4.1 追加一个列4.2 修改一个列4.3 重命名一个列4.4 删除一个列 5. 重命名…

Linux - 非root用户使用systemctl管理服务

文章目录 方式一 (推荐)1. 编辑sudoers文件:2. 设置服务文件权限:3. 启动和停止服务: 方式二1. 查看可用服务:2. 选择要配置的服务:3. 创建自定义服务文件:4. 重新加载systemd管理的…

Java 图片文件上传下载处理

Java 图片文件上传下载处理 下载 做这玩意给我恶心坏了 下载 直接访问上传的路径就可以下载图片了。但是我们往往会包一层接口,以流的方式读取 url 的内容然后返回给前端,这么做的优点是: 内网域名转外网域名,做业务校验并且让用…

【C++】new 和 delete

目录 一 引言 二 new 三 delete 四 new和delete操作自定义类型 五 operator new与operator delete函数 六 new和delete的实现原理 1 内置类型 2 自定义类型 1 new的原理 2 delete的原理 3 new T[N]的原理 4 delete[]的原理 七 定位new表达式(placement-new) 八 …

【Android Studio】各个版本下载地址

下载地址: https://developer.android.com/studio/archive?hlzh-cn

HashMap扩容机制详解

目录 1. 扩容的触发条件 2. 扩容的具体步骤 2.1 计算新的容量 2.2 创建新的桶数组 2.3 将元素重新分配到新的桶数组中 2.4 更新容量和阈值 3. 与并发性能的关系 4. 扩容的性能优化 5. 总结 HashMap是Java中常用的数据结构之一,用于存储键值对。在HashMap内…