在 Go 语言中,flag
包是用于解析命令行参数的标准库工具。它提供了一种简单的方式来定义和解析命令行标志(flags),适用于开发 CLI(Command-Line Interface)工具或需要动态配置的程序。
基本用法示例
package main
import (
"flag"
"fmt"
)
func main() {
// 定义命令行参数
var (
name = flag.String("name", "Guest", "输入用户名")
age = flag.Int("age", 0, "输入年龄")
verbose = flag.Bool("v", false, "启用详细模式")
)
// 解析命令行参数
flag.Parse()
// 使用参数
fmt.Printf("Name: %s, Age: %d\n", *name, *age)
if *verbose {
fmt.Println("Verbose mode enabled.")
}
}
运行方式
go run main.go -name Alice -age 25 -v
输出:
Name: Alice, Age: 25
Verbose mode enabled.
核心功能
定义参数
flag.String(name, default, description)
:字符串类型。flag.Int(name, default, description)
:整数类型。flag.Bool(name, default, description)
:布尔类型。- 其他类型如
Float64
、Duration
等也支持。
自定义变量绑定
可以将参数绑定到已定义的变量:var port int flag.IntVar(&port, "port", 8080, "服务端口号")
解析参数
flag.Parse()
:必须调用此方法才能生效,否则所有标志保持默认值。非标志参数
通过flag.Args()
获取未被解析的额外参数(非-flag
形式):args := flag.Args() // []string 类型
帮助信息
自动生成帮助文档(通过-h
或--help
):go run main.go -h
高级用法
- 子命令模式
类似git commit
、docker run
,使用flag.NewFlagSet()
: “`go addCmd := flag.NewFlagSet(“add”, flag.ExitOnError) name := addCmd.String(“name”, “”, “资源名称”)
if len(os.Args) > 1 && os.Args[1] == “add” {
addCmd.Parse(os.Args[2:])
fmt.Println(*name)
}
2. **自定义验证**
在调用 `Parse()` 后检查参数的合法性:
```go
if *port < 0 || *port > 65535 {
log.Fatal("端口号无效")
}
- 覆盖默认帮助信息
修改flag.Usage
: “`go flag.Usage = func() { fmt.Fprintf(flag.CommandLine.Output(), “Usage of %s:\n”, os.Args[0]) flag.PrintDefaults() fmt.Println(“\n示例: ./app -name=Bob”) }
内容由零声教学AI助手提供,问题来源于学员提问