# qflag
**Repository Path**: MM-Q/qflag
## Basic Information
- **Project Name**: qflag
- **Description**: qflag 是一个基于 Go 泛型的现代化命令行参数解析库,对标准库 flag 进行了全面增强。它采用模块化架构设计,提供了 16+ 种标志类型(包括基础类型、切片类型、复杂类型如枚举、时间、映射、大小等)、完整的子命令系统、强大的参数验证框架、智能的 Shell 自动补全(支持 Bash/PowerShell)、环境变量绑定等企业级特性。通过泛型设计确保类型安全,内置并发保护机制,支持中英文帮助
- **Primary Language**: Go
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2025-06-13
- **Last Updated**: 2025-09-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Go语言
## README
# 🚀 qflag
**功能强大的 Go 语言命令行参数解析库**
[](https://golang.org/)
[](https://opensource.org/licenses/MIT)
[](https://gitee.com/MM-Q/qflag)
[](https://github.com/QiaoMuDe/qflag)
[](https://deepwiki.com/QiaoMuDe/qflag)
*支持多种数据类型 • 子命令管理 • 参数验证 • 自动补全 • 企业级特性*
[📖 快速开始](#快速开始) • [🔧 安装指南](#安装) • [📚 API 文档](#api-文档) • [🤝 贡献指南](#贡献指南)
---
## 📋 目录
- [🚀 qflag](#-qflag)
- [📋 目录](#-目录)
- [✨ 项目简介](#-项目简介)
- [🔗 项目地址](#-项目地址)
- [📦 安装](#-安装)
- [🌟 核心特性](#-核心特性)
- [📊 支持的标志类型](#-支持的标志类型)
- [🚀 快速开始](#-快速开始)
- [🔧 高级功能示例](#-高级功能示例)
- [🎯 自动补全](#-自动补全)
- [📝 帮助信息定制](#-帮助信息定制)
- [🏗️ 项目架构](#️-项目架构)
- [📚 API 文档](#-api-文档)
- [⚡ 性能特性](#-性能特性)
- [🔄 兼容性](#-兼容性)
- [🧪 测试说明](#-测试说明)
- [🤝 贡献指南](#-贡献指南)
- [📄 许可证](#-许可证)
- [💬 支持与反馈](#-支持与反馈)
## ✨ 项目简介
qflag 是一个基于 Go 泛型的现代化命令行参数解析库,对标准库 flag 进行了全面增强。它采用模块化架构设计,提供了 16+ 种标志类型(包括基础类型、切片类型、复杂类型如枚举、时间、映射、大小等)、完整的子命令系统、强大的参数验证框架、智能的 Shell 自动补全(支持 Bash/PowerShell)、环境变量绑定等企业级特性。通过泛型设计确保类型安全,内置并发保护机制,支持中英文帮助信息,为构建专业的 CLI 应用提供了完整的解决方案。
## 🔗 项目地址
该项目同时托管在 Gitee 和 GitHub 上,您可以选择合适的平台访问:
| 平台 | 地址 | 描述 |
|------|------|------|
| 🔴 **Gitee** | [gitee.com/MM-Q/qflag](https://gitee.com/MM-Q/qflag) | 国内访问更快,主要开发仓库 |
| ⚫ **GitHub** | [github.com/QiaoMuDe/qflag](https://github.com/QiaoMuDe/qflag) | 国际化平台,同步更新 |
## 安装
使用 `go get` 命令安装:
```bash
go get -u gitee.com/MM-Q/qflag
```
然后在代码中导入:
```go
import "gitee.com/MM-Q/qflag"
import "gitee.com/MM-Q/qflag/cmd"
import "gitee.com/MM-Q/qflag/flags"
import "gitee.com/MM-Q/qflag/validator"
```
## 核心特性
### 🚀 丰富的数据类型支持
- **基础类型**:字符串、整数(int/int64/uint16/uint32/uint64)、布尔值、浮点数
- **高级类型**:枚举、时间间隔、时间、切片([]string, []int64, []int)、映射、大小
- **泛型设计**:基于 Go 泛型的类型安全标志系统
### 🎯 强大的命令管理
- **子命令支持**:构建复杂的命令树结构
- **命令嵌套**:支持多层级子命令
- **命令别名**:长短名称支持,提升用户体验
### ✅ 完善的参数验证
- **内置验证器**:字符串长度、数值范围、正则表达式、路径验证等
- **自定义验证器**:实现 `Validator` 接口,支持复杂业务逻辑验证
- **类型安全**:编译时类型检查,运行时验证保障
### 🔧 便捷的开发体验
- **自动补全**:支持 Bash 和 PowerShell 的自动补全脚本生成
- **环境变量绑定**:标志可自动从环境变量加载默认值
- **帮助信息生成**:自动生成格式化的帮助文档,支持中英文
- **错误处理**:详细的错误类型和信息,便于调试
### 🛡️ 企业级特性
- **并发安全**:使用 `sync.RWMutex` 保证线程安全
- **内存优化**:高效的内存使用和垃圾回收友好设计
- **扩展性**:模块化架构,易于扩展和定制
## 支持的标志类型
| 标志类型 | 创建函数 | 绑定函数 | 描述 | 示例 |
|----------|----------|----------|------|------|
| **基础类型** |
| `StringFlag` | `String()` | `StringVar()` | 字符串类型 | `--name "example"` |
| `IntFlag` | `Int()` | `IntVar()` | 32位整数 | `--port 8080` |
| `Int64Flag` | `Int64()` | `Int64Var()` | 64位整数 | `--size 1073741824` |
| `Uint16Flag` | `Uint16()` | `Uint16Var()` | 16位无符号整数 | `--timeout 300` |
| `Uint32Flag` | `Uint32()` | `Uint32Var()` | 32位无符号整数 | `--max-conn 1000` |
| `Uint64Flag` | `Uint64()` | `Uint64Var()` | 64位无符号整数 | `--max-size 9223372036854775807` |
| `BoolFlag` | `Bool()` | `BoolVar()` | 布尔类型 | `--debug` |
| `Float64Flag` | `Float64()` | `Float64Var()` | 64位浮点数 | `--threshold 0.95` |
| **高级类型** |
| `EnumFlag` | `Enum()` | `EnumVar()` | 枚举类型 | `--mode "debug"` |
| `StringSliceFlag` | `StringSlice()` | `StringSliceVar()` | 字符串切片 | `--files file1,file2` |
| `IntSliceFlag` | `IntSlice()` | `IntSliceVar()` | 整数切片 | `--ports 8080,9000,3000` |
| `Int64SliceFlag` | `Int64Slice()` | `Int64SliceVar()` | 64位整数切片 | `--sizes 1024,2048,4096` |
| `DurationFlag` | `Duration()` | `DurationVar()` | 时间间隔 | `--timeout 30s` |
| `TimeFlag` | `Time()` | `TimeVar()` | 时间类型 | `--start "2024-01-01T00:00:00"` |
| `MapFlag` | `Map()` | `MapVar()` | 键值对映射 | `--config key=value,key2=value2` |
| `SizeFlag` | `Size()` | `SizeVar()` | 大小类型 | `--max-size 1024MB` |
## 快速开始
### 基本使用示例
```go
package main
import (
"fmt"
"os"
"gitee.com/MM-Q/qflag"
)
func main() {
// 定义标志
name := qflag.String("name", "n", "world", "要问候的名称")
count := qflag.Int("count", "c", 1, "问候次数")
verbose := qflag.Bool("verbose", "v", false, "详细输出")
// 解析命令行参数
if err := qflag.Parse(); err != nil {
fmt.Printf("解析参数错误: %v\n", err)
os.Exit(1)
}
// 使用参数值
for i := 0; i < count.Get(); i++ {
if verbose.Get() {
fmt.Printf("第 %d 次问候: ", i+1)
}
fmt.Printf("Hello, %s!\n", name.Get())
}
}
```
使用方式:
```bash
./app --name "Alice" --count 3 --verbose
./app -n "Bob" -c 2 -v
```
### 子命令示例
```go
package main
import (
"flag"
"fmt"
"os"
"gitee.com/MM-Q/qflag"
)
func main() {
// 全局标志
verbose := qflag.Bool("verbose", "v", false, "详细输出")
// 创建子命令
startCmd := qflag.NewCmd("start", "s", flag.ExitOnError)
startCmd.SetDescription("启动服务")
// 为子命令添加标志
port := startCmd.Int("port", "p", 8080, "服务端口")
host := startCmd.String("host", "h", "localhost", "服务主机")
// 创建另一个子命令
stopCmd := qflag.NewCmd("stop", "st", flag.ExitOnError)
stopCmd.SetDescription("停止服务")
pidFile := stopCmd.String("pid-file", "f", "/var/run/app.pid", "PID文件路径")
// 注册子命令
qflag.AddSubCmd(startCmd, stopCmd)
// 解析参数
if err := qflag.Parse(); err != nil {
fmt.Printf("解析参数错误: %v\n", err)
os.Exit(1)
}
// 处理命令逻辑
if startCmd.IsParsed() {
if verbose.Get() {
fmt.Printf("启动服务在 %s:%d\n", host.Get(), port.Get())
}
// 启动服务逻辑...
} else if stopCmd.IsParsed() {
if verbose.Get() {
fmt.Printf("从 %s 读取PID并停止服务\n", pidFile.Get())
}
// 停止服务逻辑...
}
}
```
使用方式:
```bash
./app start --port 9000 --host 0.0.0.0 --verbose
./app stop --pid-file /tmp/app.pid -v
```
## 高级功能示例
### 1. 枚举类型标志
```go
package main
import (
"fmt"
"os"
"gitee.com/MM-Q/qflag"
)
func main() {
// 创建枚举标志
logLevel := qflag.Enum("log-level", "l", "info",
"日志级别", []string{"debug", "info", "warn", "error"})
// 设置大小写敏感(可选)
logLevel.SetCaseSensitive(false)
if err := qflag.Parse(); err != nil {
fmt.Printf("解析参数错误: %v\n", err)
os.Exit(1)
}
fmt.Printf("当前日志级别: %s\n", logLevel.Get())
}
```
### 2. 切片类型标志
```go
package main
import (
"fmt"
"os"
"gitee.com/MM-Q/qflag"
)
func main() {
// 创建字符串切片标志
files := qflag.StringSlice("files", "f", []string{}, "要处理的文件列表")
// 创建整数切片标志
ports := qflag.IntSlice("ports", "p", []int{8080}, "服务端口列表")
// 创建64位整数切片标志
sizes := qflag.Int64Slice("sizes", "s", []int64{}, "文件大小列表")
// 自定义分隔符(默认为逗号)
files.SetDelimiters([]string{";"})
ports.SetDelimiters([]string{","})
if err := qflag.Parse(); err != nil {
fmt.Printf("解析参数错误: %v\n", err)
os.Exit(1)
}
fmt.Printf("要处理的文件: %v\n", files.Get())
fmt.Printf("服务端口: %v\n", ports.Get())
fmt.Printf("文件大小: %v\n", sizes.Get())
}
```
使用方式:
```bash
./app --files file1.txt;file2.txt;file3.txt --ports 8080,9000,3000 --sizes 1024,2048,4096
```
### 3. 映射类型标志
```go
package main
import (
"fmt"
"os"
"gitee.com/MM-Q/qflag"
)
func main() {
// 创建映射标志
config := qflag.Map("config", "c", map[string]string{}, "配置键值对")
// 设置分隔符(键值对分隔符,键值分隔符)
config.SetDelimiters(",", ":")
if err := qflag.Parse(); err != nil {
fmt.Printf("解析参数错误: %v\n", err)
os.Exit(1)
}
fmt.Printf("配置: %v\n", config.Get())
}
```
使用方式:`./app --config server:localhost,port:8080,debug:true`
### 4. 参数验证
```go
package main
import (
"fmt"
"os"
"gitee.com/MM-Q/qflag"
"gitee.com/MM-Q/qflag/validator"
)
func main() {
// 创建带验证的标志
port := qflag.Int("port", "p", 8080, "服务端口")
// 设置端口范围验证器
port.SetValidator(&validator.IntRangeValidator{
Min: 1024,
Max: 65535,
})
// 字符串长度验证
name := qflag.String("name", "n", "", "服务名称")
name.SetValidator(&validator.StringLengthValidator{
Min: 3,
Max: 20,
})
if err := qflag.Parse(); err != nil {
fmt.Printf("解析参数错误: %v\n", err)
os.Exit(1)
}
fmt.Printf("服务 %s 将在端口 %d 启动\n", name.Get(), port.Get())
}
```
### 5. 环境变量绑定
```go
package main
import (
"fmt"
"os"
"gitee.com/MM-Q/qflag"
)
func main() {
// 创建标志并绑定环境变量
dbHost := qflag.String("db-host", "", "localhost", "数据库主机")
dbHost.BindEnv("DATABASE_HOST")
dbPort := qflag.Int("db-port", "", 5432, "数据库端口")
dbPort.BindEnv("DATABASE_PORT")
if err := qflag.Parse(); err != nil {
fmt.Printf("解析参数错误: %v\n", err)
os.Exit(1)
}
fmt.Printf("连接数据库: %s:%d\n", dbHost.Get(), dbPort.Get())
}
```
使用方式:
```bash
export DATABASE_HOST=prod-db.example.com
export DATABASE_PORT=3306
./app # 将使用环境变量的值
./app --db-host localhost --db-port 5432 # 命令行参数优先级更高
```
### 6. 自定义验证器
```go
package main
import (
"errors"
"fmt"
"os"
"strings"
"gitee.com/MM-Q/qflag"
"gitee.com/MM-Q/qflag/flags"
)
// 自定义邮箱验证器
type EmailValidator struct{}
func (v *EmailValidator) Validate(value any) error {
email, ok := value.(string)
if !ok {
return errors.New("value is not a string")
}
if !strings.Contains(email, "@") || !strings.Contains(email, ".") {
return errors.New("invalid email format")
}
return nil
}
func main() {
email := qflag.String("email", "e", "", "用户邮箱")
email.SetValidator(&EmailValidator{})
if err := qflag.Parse(); err != nil {
fmt.Printf("解析参数错误: %v\n", err)
os.Exit(1)
}
fmt.Printf("用户邮箱: %s\n", email.Get())
}
```
## 自动补全
qflag 支持为 Bash 和 PowerShell 生成自动补全脚本:
### Bash 补全
```bash
# 生成 Bash 补全脚本
./your-app --generate-shell-completion bash > your-app-completion.sh
# 安装补全脚本
sudo cp your-app-completion.sh /etc/profile.d/
source /etc/profile.d/your-app-completion.sh
```
### PowerShell 补全
```powershell
# 生成 PowerShell 补全脚本
./your-app.exe --generate-shell-completion pwsh > your-app-completion.ps1
# 安装补全脚本
. ./your-app-completion.ps1
```
## 帮助信息定制
```go
package main
import (
"gitee.com/MM-Q/qflag"
)
func main() {
// 设置应用信息
qflag.SetVersion("1.0.0")
qflag.SetDescription("这是一个示例应用程序")
qflag.SetUsageSyntax("myapp [选项] <命令> [参数...]")
// 添加使用示例
qflag.AddExample("启动服务", "myapp start --port 8080")
qflag.AddExample("查看状态", "myapp status --verbose")
// 添加注意事项
qflag.AddNote("配置文件默认位置: ~/.myapp/config.yaml")
qflag.AddNote("日志文件位置: /var/log/myapp.log")
// 设置中文帮助信息
qflag.SetUseChinese(true)
// 定义标志...
name := qflag.String("name", "n", "world", "要问候的名称")
if err := qflag.Parse(); err != nil {
return
}
// 应用逻辑...
}
```
## 项目架构
qflag 采用模块化设计,主要包含以下包:
- **`qflag`** - 主包,提供全局 API 和便捷函数
- **`cmd`** - 命令管理,处理子命令和命令树结构
- **`flags`** - 标志类型定义,包含所有标志类型的实现
- **`validator`** - 参数验证器,提供常用验证器和验证接口
- **`qerr`** - 错误处理,定义错误类型和错误处理机制
- **`utils`** - 工具函数,提供通用的辅助功能
- **`internal`** - 内部实现包,包含核心解析逻辑
## API 文档
完整的 API 文档按模块组织:
- **[qflag 包文档](./APIDOC.md)** - 全局 API 和便捷函数
- **[cmd 包文档](./cmd/APIDOC.md)** - 命令管理相关 API
- **[flags 包文档](./flags/APIDOC.md)** - 标志类型定义和使用方法
- **[validator 包文档](./validator/APIDOC.md)** - 参数验证器接口和实现
- **[qerr 包文档](./qerr/APIDOC.md)** - 错误处理相关 API
## 性能特性
- **内存效率**:优化的内存分配策略,减少 GC 压力
- **并发安全**:全面的线程安全保护,支持并发访问
- **解析速度**:高效的参数解析算法,适合大型应用
- **类型安全**:编译时类型检查,避免运行时类型错误
## 兼容性
- **Go 版本**:要求 Go 1.24+ (支持泛型)
- **操作系统**:支持 Windows、Linux、macOS
- **Shell 支持**:Bash、PowerShell
## 🧪 测试说明
qflag 提供了完整的测试套件,确保代码质量和功能稳定性。
### 运行测试
```bash
# 运行所有测试
go test ./...
# 运行测试并显示覆盖率
go test -cover ./...
# 生成详细的覆盖率报告
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out -o coverage.html
# 运行基准测试
go test -bench=. ./...
# 运行特定包的测试
go test ./flags
go test ./cmd
go test ./validator
```
### 测试结构
```
qflag/
├── flags/
│ ├── *_test.go # 标志类型测试
│ └── sizeflag_test.go # 大小标志专项测试
├── cmd/
│ ├── *_test.go # 命令管理测试
│ └── extended_test.go # 扩展功能测试
├── validator/
│ └── *_test.go # 验证器测试
└── qerr/
└── *_test.go # 错误处理测试
```
### 测试覆盖率目标
- **整体覆盖率**:> 90%
- **核心包覆盖率**:> 95%
- **关键功能**:100% 覆盖
### 持续集成
项目配置了自动化测试流程:
- **代码质量检查**:使用 `golangci-lint` 进行静态分析
- **多版本测试**:在 Go 1.24+ 版本上测试
- **跨平台测试**:Windows、Linux、macOS 环境验证
## 🤝 贡献指南
我们欢迎社区贡献!请遵循以下步骤:
1. Fork 项目到您的 GitHub/Gitee 账户
2. 创建特性分支:`git checkout -b feature/amazing-feature`
3. 提交更改:`git commit -m 'Add amazing feature'`
4. 推送分支:`git push origin feature/amazing-feature`
5. 创建 Pull Request
### 开发规范
- 遵循 Go 官方代码规范
- 添加适当的单元测试
- 更新相关文档
- 确保所有测试通过
## 许可证
本项目采用 MIT 许可证。详情请参阅 [LICENSE](LICENSE) 文件。
## 支持与反馈
- **问题报告**:[Gitee Issues](https://gitee.com/MM-Q/qflag/issues)
- **功能请求**:[GitHub Issues](https://github.com/QiaoMuDe/qflag/issues)
- **讨论交流**:欢迎在 Issues 中讨论使用问题和改进建议
---
**qflag** - 让命令行参数解析变得简单而强大! 🚀