Go:命令行参数解析包 flag 简介

文章目录


在 Golang 程序中有很多种方法来处理命令行参数。简单的情况下可以不使用任何库,直接处理 os.Args;其实 Golang 的标准库提供了 flag 包来处理命令行参数;还有第三方提供的处理命令行参数的库,比如 Pflag 等。本文将介绍 Golang 标准库中 flag 包的用法

示例

导入包

import "flag"

代码示例:

package main

import "flag"
import "fmt"

// 定义命令行参数对应的变量,这三个变量都是指针类型
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")
}

func main() {
    // 初始化变量 cliFlag
    Init()
    // 把用户传递的命令行参数解析为对应变量的值
    flag.Parse()
    
    // flag.Args() 函数返回没有被解析的命令行参数
    // func NArg() 函数返回没有被解析的命令行参数的个数
    fmt.Printf("args=%s, num=%d\n", flag.Args(), flag.NArg())
    for i := 0; i != flag.NArg(); i++ {
        fmt.Printf("arg[%d]=%s\n", i, flag.Arg(i))
    }
    
    // 输出命令行参数
    fmt.Println("name=", *cliName)
    fmt.Println("age=", *cliAge)
    fmt.Println("gender=", *cliGender)
    fmt.Println("flagname=", cliFlag)
}

定义一个整型的参数 age,返回指针类型的变量:

var cliAge = flag.Int("age", 28, "Input Your Age")

创建值类型的参数变量,并在 Init() 函数中对其初始化(注意这里调用的是 flag.IntVar 方法):

var cliFlag int
func Init() {
    flag.IntVar(&cliFlag, "flagname", 1234, "Just for demo")
}

通过 flag.Parse() 函数接下命令行参数,解析函数将会在碰到第一个非 flag 命令行参数时停止:

flag.Parse()

命令行传参的格式:

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

运行

在 flagdemo 目录下执行 go build 命令编译 demo 生成可执行文件 flagdemo。

不传递命令行参数 ,此时输出的命令行参数都是定义的默认值。
在这里插入图片描述

传递命令行参数,传递的命令行参数会覆盖默认值。
在这里插入图片描述

传递多余的命令行参数,可以通过 flag.Args() 和 flag.NArg() 函数获取未能解析的命令行参数。
在这里插入图片描述

传递错误的命令行参 ,如果通过 -xx 传入未定义的命令行参数,则会直接报错退出,并输出帮助信息。
在这里插入图片描述

查看帮助信息,通过命令行参数 -h 或 --help 可以查看帮助信息:
在这里插入图片描述

小结

本文介绍了 Golang 标准库中 flag 包的基本用法,并进一步分析了其主要的代码逻辑。其实 flag 包还支持用户自定义类型的命令行参数,本文不再赘述,有兴趣的朋友请参考官方 demo。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Freedom3568

技术域不存在英雄主义,不进则退

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值