当前位置: 首页 > news >正文

go语言中flag包的使用

// 定义命令行参数对应的变量,这三个变量都是指针类型
var cliName = flag.String("name", "nick", "Input Your Name")
var cliAge = flag.Int("age", 28, "Input Your Age")
var cliGender = flag.String("gender", "male", "Input Your Gender")// 定义一个值类型的命令行参数变量,在 Init() 函数中对其初始化
// 因此,命令行参数对应变量的定义和初始化是可以分开的
var cliFlag int
func Init() {flag.IntVar(&cliFlag, "flagname", 1234, "Just for demo")
}> 

这是两种定义命令行参数的方式:

// 定义命令行参数对应的变量,这三个变量都是指针类型
var cliName = flag.String("name", "nick", "Input Your Name")
var cliAge = flag.Int("age", 28, "Input Your Age")
var cliGender = flag.String("gender", "male", "Input Your Gender")

这是第一种方式,这种方式定义的变量都是指针类型的。
直接返回指针方式。适用于所需参数不是特别多的场景。

  • 函数直接返回指针类型变量
  • 变量定义和初始化在同一行完成
  • 使用时需要解引用(如*cliName)
var cliFlag int
func Init() {flag.IntVar(&cliFlag, "flagname", 1234, "Just for demo")
}> 

这是第二种方式,这种方式是:变量地址传递方式

  • 需要先定义值类型变量
  • 通过变量地址(&)传递给 flag 函数
  • 可以将定义和初始化分开
  • 使用时直接使用变量名

直接返回指针方式适用场景:

  • 简单的命令行参数定义
  • 参数较少的情况
  • 不需要复杂的初始化逻辑
  • 快速原型开发

变量地址传递方式适用场景:

  • 需要将参数定义和初始化分离的情况
  • 有复杂的初始化逻辑
  • 需要在 init 函数中初始化
  • 大型项目中的模块化设计
  • 需要对参数进行更多控制的场景

但是在大多安全工具开发过程中,使用第一种方式进行定义命令行参数的定义。

第一种方式的定义有很多:

var (portFlag    = flag.String("p", "", "")timeout     = flag.Duration("t", defaultTimeout, "")showVersion = flag.Bool("v", false, "")showHelp    = flag.Bool("h", false, "")standMode   = flag.Bool("stand", false, "")lieMode     = flag.Bool("lie", false, "")retries     = flag.Int("retries", defaultRetries, ""))

这样就可以快速的定义很多命令行参数。

需要注意的是:

通过flag.String定义的命令行参数中的值portFlag = flag.String("p", "", "")
第一个值:"p":这个是执行命令的时候-p时需要携带的值。
第二个值:""是默认值
第三个值:-h时的提示词

例如:

package mainimport ("flag""fmt"
)// 直接声明指针变量 + 绑定命令行参数
var cliAge = flag.Int("age", 28, "Input Your Age")
//命令行参数:age
//默认值:28
//-h时帮助文本:Input Your Agefunc main() {flag.Parse() // 解析命令行参数fmt.Println("年龄:", *cliAge) // 必须解引用取值
}
//输入:go run name.go -age 18
//输出:年龄:18

其中:flag.Parse() // 解析命令行参数的作用就是接收并解析命令行中的参数,解析函数将会在碰到第一个非 flag 命令行参数时停止。

-isbool    (一个 - 符号,布尔类型该写法等同于 -isbool=true)
-age=x     (一个 - 符号,使用等号)
-age x     (一个 - 符号,使用空格)
--age=x    (两个 - 符号,使用等号)
--age x    (两个 - 符号,使用空格)

借鉴博客:https://www.cnblogs.com/sparkdev/p/10812422.html

http://www.jsqmd.com/news/111495/

相关文章:

  • 北京雅思培训机构保姆级攻略:这些小众宝藏机构帮你精准提分 - 品牌测评鉴赏家
  • 雅思封闭班怎么选?这3家口碑黑马帮你避开踩坑套路 - 品牌测评鉴赏家
  • Claude Code架构解析
  • 2025年武汉做得好的光固化保护套设计哪家好,环氧酚醛/环氧玻璃钢/石墨烯涂料/无溶剂环氧涂料/光固化保护套门店有哪些 - 品牌推荐师
  • 2025 雅思培训机构怎么选?这 5 大核心指标帮你避坑 - 品牌测评鉴赏家
  • QMenu自定义阴影效果
  • Sentinel 全面详解笔记
  • WinCC 更新后无法连接 OPC UA 服务器
  • 解码Qt 视图窗口与多界面组件
  • 2025 最新活性叶酸品牌 TOP9 评测!国内优质源头厂商权威榜单发布,科学赋能构筑健康生态 - 全局中转站
  • 2025年激光投影机技术白皮书与主流机型选购推荐,16000流明投影机/12000流明投影机/8000流明投生产厂家推荐 - 品牌推荐师
  • 软件工程学习日志2025.12.18
  • 12/18
  • 实际项目中TensorFlow/Keras模型优化落地指南
  • Linux提取
  • Level 5 → Level 6
  • MyBatis的TypeHandler :优雅地建立内容加密与解密
  • MyBatis的TypeHandler :优雅地建立内容加密与解密
  • 2025年合肥做得好的无溶剂环氧涂料批发排行榜,石墨烯涂料/光固化保护套/环氧玻璃钢/无溶剂环氧涂料/无溶剂环氧涂料定制怎么选择 - 品牌推荐师
  • 【LangChain4J】聊天记忆-高阶Api
  • 详细介绍:雪花id改多workerID依赖redis
  • 最小二乘问题详解9:使用Ceres求解非线性最小二乘
  • 第六十三篇
  • ArchLinux 开机自动打开 NumLock
  • P5782 [POI 2001] 和平委员会
  • 1. Markdown语法
  • 斯特林数杂谈
  • [Non] - 选举
  • 浅析Cursor Rules了解(工作原理、四种规则类型对比、文件结构、分层设计)及如何在项目中使用的最佳实践
  • 辛普森法则