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 stringage intsmoking boolweight 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 mainimport ("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 = splitreturn 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.hqwc.cn/news/283538.html

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

相关文章

基于PyCharm实现串口GUI编程

工具效果如下如所示 下面简单介绍一下操作流程 1.打开PyCharm软件 2.创建一个工程 3.给该工程命名 4.在main.py里面黏贴如下的代码 # This is a sample Python script. # Press ShiftF10 to execute it or replace it with your code. # Press Double Shift to search everyw…

vcs+verdi+uvm单步调试及问题记录

编译 编译选项如下: vcs -ntb_opts uvm -sverilog -f $PROJ_ROOT/tb/option.f -debug_accessall -kdb -lca -full64 -fsdb_old -timescale1ns/10ps其中最重要的是要加上这四项 -debug_accessall -kdb -lca -full64 option.f里面的内容如下,是一些verd…

mybatis plus 公共字段自动填充createBy updateBy

一、公共字段自动填充 需求:好多表公共的字段,赋值逻辑也相同,不用每次为其赋值,‘拦截器’统一赋值。 1. 在新增数据时,需要设置创建时间、创建人、修改时间、修改人等字段,在编辑数据时需要设置修改时间…

常见光模块的封装

光模块的封装,保障了光通信的稳定和可靠性。本文介绍几种常见的光模块的封装类型。 19封装–焊接型光模块,一般速度不高于千兆,多采用SC接口。 SFP封装:SFP(Small form-factor pluggable)意思是小型可拔插式…

2023NEFU实习项目解析 - 中俄贸易供需服务平台

文章目录 项目概述项目初始化搭建项目初始框架配置Tomcat建立项目数据库编写统一返回类及其工具类编写数据库工具类通过Filter解决Response返回中文乱码问题使用Filter解决权限校验问题 项目主干开发用户登录企业管理(分页查询原生实现)上传VIP申请书模板…

鸿蒙 Ark ui 实战登录界面请求网络实现教程

团队介绍 作者:徐庆 团队:坚果派 公众号:“大前端之旅” 润开鸿生态技术专家,华为HDE,CSDN博客专家,CSDN超级个体,CSDN特邀嘉宾,InfoQ签约作者,OpenHarmony布道师&…

2023/12/15 work

1. tcp 客户端、服务端通讯 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <myhead.h>#define SERVICE_PORT 9994 #define SERVICE_IP "192.168.0.106"int main(int argc, const char *argv[]) {//服务端//1. 创建…

LangChain 28 BabyAGI编写旧金山的天气预报

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

verilog基础语法-计数器

概述&#xff1a; 计数器是FPGA开发中最常用的电路&#xff0c;列如通讯中记录时钟个数&#xff0c;跑马灯中时间记录&#xff0c;存储器中地址的控制等等。本节给出向上计数器&#xff0c;上下计数器以及双向计数器案例。 内容 1. 向上计数器 2.向下计数器 3.向上向下计数…

《数据结构、算法与应用C++语言描述》-机器调度-最长处理时间(LPT)-堆应用

机器调度 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_28LongestProcessingTime 问题描述 一个工厂具有 m台一模一样的机器。我们有n 个任务需要处理。设作业i的处理时间为 t i t_i ti​&#xff0c;这个时间包括把作业放入机器…

【Logback技术专题】「入门到精通系列教程」深入探索Logback日志框架的原理分析和开发实战技术指南(上篇)

深入探索Logback日志框架的原理分析和开发实战指南系列 Logback日志框架Logback基本模块logback-corelogback-classiclogback-accessLogback的核心类LoggerAppenderLayoutLayout和Appender filterlogback模块和核心所属关系 Logbackj日志级别日志输出级别日志级别介绍 Logback的…

【数据结构】树状数组总结

知识概览 树状数组有两个作用&#xff1a; 快速求前缀和 时间复杂度O(log(n))修改某一个数 时间复杂度O(log(n)) 例题展示 1. 单点修改&#xff0c;区间查询 题目链接 活动 - AcWing本活动组织刷《算法竞赛进阶指南》&#xff0c;系统学习各种编程算法。主要面向…