zoukankan      html  css  js  c++  java
  • go语言的flag

    Go语言标准库flag

    go语言内置的flag的包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。

    os.Args

    简单的获取命令行参数,可以通过os.Args获取。

    package main
    
    import (
    	"fmt"
    	"os"
    )
    
    func main() {
    
    	// os.args 是一个字符串切片类型
    	fmt.Printf("%v
    ", os.Args)
    
    	// 遍历每个命令行参数
    	for index, arg := range os.Args {
    		fmt.Printf("第%d个 参数值:%v
    ", index, arg)
    	}
    }
    
    

    运行:

    go run args.go arg1 arg2 arg3
    

    执行结果:

    [C:UsersJIANGZ~1AppDataLocalTempgo-build073370358001exeargs.exe arg1 arg2 arg3]
    第0个 参数值:C:UsersJIANGZ~1AppDataLocalTempgo-build073370358001exeargs.exe
    第1个 参数值:arg1
    第2个 参数值:arg2
    第3个 参数值:arg3
    

    基本使用

    导入

    import "flag"
    

    参数类型

    支持的命令行参数有boolintint64uintuint64floatfloat64string

    定义命令行参数

    flag.Type()

    格式:flag.Type(flag名, 默认值, 帮助信息)

    比如说我们要定义姓名、年龄、婚否三个命令行参数。

    package main
    
    import (
    	"flag"
    	"fmt"
    )
    
    func main() {
    	name := flag.String("name", "江子牙", "姓名")
    	age := flag.Int("age", 23, "年龄")
    	isLogin := flag.Bool("isLogin", true, "是都登录")
    
    	// 此时三个变量都是对应类型的指针, 可以用*取值
    	fmt.Printf("%p %v 
    ", name, *name)
    	fmt.Printf("%p %v 
    ", age, *age)
    	fmt.Printf("%p %v 
    ", isLogin, *isLogin)
    }
    
    

    运行和输出:

    >go run flag_type1.go
    0xc000046200 江子牙
    0xc00005a058 23
    0xc00005a070 true
    
    flag.TypeVar()

    格式:flag.TypeVar(Type指针, flag名, 默认值, 帮助信息)

    比如说我们要定义姓名、年龄、婚否三个命令行参数。

    package main
    
    import (
    	"flag"
    	"fmt"
    )
    
    func main() {
    
    	var (
    		name    string
    		age     int
    		isLogin bool
    	)
    
    	flag.StringVar(&name, "name", "江子牙", "姓名")
    	flag.IntVar(&age, "age", 23, "年龄")
    	flag.BoolVar(&isLogin, "isLogin", false, "是否登录")
    
    	// 此时三个变量均有有默认值
    	fmt.Printf("%#v
    ", name)
    	fmt.Printf("%#v
    ", age)
    	fmt.Printf("%#v
    ", isLogin)
    
    }
    

    运行和输出:

    >go run flag_type2.go
    "江子牙"
    23
    false
    

    解析命令行参数

    通过两种方法定义好命令行flag参数后,需要通过flag.Parse()来对命令进行参数解析。

    支持的格式有以下几种:

    • -flag xxx:使用空格,1个符号
    • --flag xxx:使用空格,2个符号
    • -flag=xxx:使用等号,一个符号
    • --flag=xxx:使用等号,一个符号

    其中布尔类型的必须使用等号的方式指定。

    另外还有一些其他方法:

    • flag.NFlag():返回命令行参数个数
    • flag.Args():返回命令行参数之后的其他参数
    • flag.NArg():返回命令行参数之后的其他参数个数

    完整示例:

    package main
    
    import (
    	"flag"
    	"fmt"
    )
    
    func main() {
    	// 定义命令行参数
    	name := flag.String("name", "江子牙", "姓名")
    	age := flag.Int("age", 23, "年龄")
    	isLogin := flag.Bool("isLogin", true, "是都登录")
    
    	// 解析命令行参数
    	flag.Parse()
    
    	// 输出
    	fmt.Println(*name, *age, *isLogin)
    
    	// 返回命令行参数个数
    	fmt.Println(flag.NFlag())
    
    	// 返回命令行参数之后的其他参数
    	fmt.Println(flag.Args())
    
    	// 返回命令行参数之后的其他参数个数
    	fmt.Println(flag.NArg())
    }
    
    

    运行和输出:

    >go run  flag_parse.go --name="江子牙" --age 21 -isLogin=false hehe haha
    江子牙 21 false
    3
    [hehe haha]
    2
    
  • 相关阅读:
    Codeforces 1163E 高斯消元 + dfs
    Codeforces 1159E 拓扑排序
    Codeforces 631E 斜率优化
    Codeforces 1167F 计算贡献
    Codeforces 1167E 尺取法
    Gym 102007I 二分 网络流
    Codeforces 319C DP 斜率优化
    Codeforces 1163D DP + KMP
    Comet OJ
    Vue 的响应式原理中 Object.defineProperty 有什么缺陷?为什么在 Vue3.0 采用了 Proxy,抛弃了 Object.defineProperty?
  • 原文地址:https://www.cnblogs.com/xjmlove/p/11188647.html
Copyright © 2011-2022 走看看