c语言编程笔录

首页 >   > 笔记大全

笔记大全

golang flag 用法

更新时间:2023-10-09

概述

使用命令行配置程序是编写高质量代码的重要组成部分。在Golang中,flag是标准库中内置的一个包,用于解析命令行参数和选项。例如,您在cmd中使用 “-h”, “--help”, "--version"等指令,这些都是标准的选项。接下来,我们将学习Golang flag包中可用的参数类型、用法及示例。

基本用法

flag包中使用两种方式来获取命令行参数,一个是在参数名之后使用“=”进行赋值,即:“-参数名=值”;另一种方式是在参数名之后直接写要传递的值,即“-参数名 值”。下面展示了最基本的使用方法:

```go package main import ( "flag" "fmt" ) func main() { // 定义一个整型参数 var num int flag.IntVar(&num, "num", 0, "input a num") flag.Parse() fmt.Printf("num:%d", num) } ``` 在运行代码时,需要在命令行输入参数 "num"。例如,在命令行中输入: ```bash go run main.go -num 123 ``` 控制台将输出: ```bash num: 123 ```

标准选项

在flag包中,我们可以使用 “_” 或 “-”表示命令行选项的“单字母”和“多字母”版本。例如,“-h” 和 “--help” 表示同一个选项“help”,“-v” 和--version” 表示同一个选项“version”。

下面展示一个标准选项的示例: ```go package main import ( "flag" "fmt" ) func main() { var ( // bool 类型一定要先定义为变量 v bool h bool version bool ) flag.BoolVar(&v, "v", false, "输出版本信息") flag.BoolVar(&h, "h", false, "帮助") flag.BoolVar(&version, "version", false, "输出版本信息") flag.Parse() // 判断是否需要输出版本信息 if v || version { fmt.Println("myapp version 1.0") } // 是否需要帮助 if h { fmt.Println("Usage: myapp [-hv]") flag.PrintDefaults() } } ``` 下面是该示例的运行结果: ```bash ? go run main.go -v myapp version 1.0 ? go run main.go --version myapp version 1.0 ? go run main.go -h Usage: myapp [-hv] -h 帮助 -v 输出版本信息 ```

非标准选项

除了标准选项,我们还可以自定义非标准选项,例如传递一个文件路径,或者在程序中传递一些数据等。下面展示一个自定义选项的示例:

```go package main import ( "flag" "fmt" ) func main() { var file string flag.StringVar(&file, "file", "", "文件路径") flag.Parse() if file == "" { fmt.Println("请输入要读取的文件路径") return } fmt.Println("you have selected file: ", file) } ``` 在运行代码时,需要在命令行输入自定义参数 "file"。例如,在命令行中输入: ```bash go run main.go -file test.txt ``` 控制台将输出选项值: ```bash you have selected file: test.txt ```

指定变量类型

在flag包中,我们可以指定不同类型的变量,如字符串、整型、布尔值等。下面是一个示例。可以通过设定默认值对变量进行初始化,并且还可以设置一个默认参数:

```go package main import ( "flag" "log" "fmt" ) func main() { var name string flag.StringVar(&name, "name", "world", "用户名称") var age int flag.IntVar(&age, "age", 18, "用户年龄") var married bool flag.BoolVar(&married, "married", true, "是否已婚") var delay float64 flag.Float64Var(&delay, "delay", 0.0, "延迟") var input []string flag.Var((*stringSlice)(&input), "input", "输入") flag.Parse() // 输出结果 log.Printf("name=%s, age=%d, married=%t, delay=%f, inputs=%v", name, age, married, delay, input) } // 变量类型转换 type stringSlice []string func (s *stringSlice) String() string { return fmt.Sprintf("%v", *s) } func (s *stringSlice) Set(val string) error { *s = append(*s, val) return nil } ``` 在运行代码时,可以输入不同类型的参数。例如: ```bash go run main.go -name="Tom" -age=20 -married=false -delay=3.14 -input "1" -input "2" ``` 控制台将输出: ```bash 2020/11/23 17:57:58 name=Tom, age=20, married=false, delay=3.140000, inputs=[1 2] ``` 以上就是Golang flag包的用法和示例。flag包是Golang标准库中一个非常实用的包,它能帮助我们解析命令行参数和选项,使得我们的程序更加易于使用和可靠性更高。