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 main

import (
	"flag"
	"fmt"
)

// 直接声明指针变量 + 绑定命令行参数
var cliAge = flag.Int("age", 28, "Input Your Age")
//命令行参数:age
//默认值:28
//-h时帮助文本:Input Your Age

func 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

posted @ 2025-12-18 22:21  欧派派  阅读(7)  评论(0)    收藏  举报