下面是一份 “golang实现命令行程序的使用帮助功能”的完整攻略:
1. 引用第三方库
在golang中,我们可以使用 flag 包来方便的解析命令行参数,并生成帮助信息。
因此,第一步需要引用 flag:
import (
"flag"
"fmt"
"os"
)
2. 定义命令行参数
在代码中定义变量来表示命令行参数,可以是标志(flag)、开关(switch)或参数(argument),例如:
var (
flagOpt1 = flag.Bool("opt1", false, "help message for opt1")
flagOpt2 = flag.Int("opt2", 0, "help message for opt2")
arg1 = flag.String("arg1", "", "help message for arg1")
)
其中,flag.String()
、flag.Bool()
和flag.Int()
函数均有相同的参数:
- 参数的名称
- 参数的默认值
- 参数的帮助信息
3. 解析命令行参数
在代码中,使用flag.Parse()
函数来解析命令行参数。
func main() {
flag.Parse()
fmt.Println("opt1:", *flagOpt1)
fmt.Println("opt2:", *flagOpt2)
fmt.Println("arg1:", *arg1)
}
4. 提供使用帮助信息
使用flag包的默认方式,可以通过提供 -h
或 -help
标志来获取使用帮助信息。 flag 包会输出类似下面的信息:
Usage of test:
-arg1 string
help message for arg1
-opt1
help message for opt1
-opt2 int
help message for opt2 (default 0)
5. 自定义使用帮助信息的内容
命令行程序的使用帮助信息是非常重要的,因此我们需要能够自定义帮助信息。
可以使用 flag.SetUsageTemplate() 函数来自定义帮助信息的格式。
const usage = `Usage: %s [options] [args]
Options:
%s
`
func main() {
flag.Usage = func() {
fmt.Fprintf(os.Stderr, usage, os.Args[0], flagSet())
}
flag.Parse()
}
func flagSet() string {
flagSet := &flag.FlagSet{}
flagSet.SetOutput(bytes.NewBuffer(nil))
flagSet.Bool("opt1", false, "help message for opt1")
flagSet.Int("opt2", 0, "help message for opt2")
flagSet.String("arg1", "", "help message for arg1")
flagSet.PrintDefaults()
return flagSet.Output. String()
}
通过调用 flag.Usage()
会输出自定义的帮助信息,格式如下:
Usage: test [options] [args]
Options:
-arg1 string
help message for arg1
-opt1
help message for opt1
-opt2 int
help message for opt2 (default 0)
6. 示例
下面给出两个示例,第一个示例命令行程序输出每个参数的值,并自定义帮助信息的格式。
package main
import (
"bytes"
"flag"
"fmt"
"os"
)
const usage = `Usage: %[1]s [options] [args]
Options:
%[2]s
`
func main() {
flag.Usage = func() {
fmt.Fprintf(os.Stderr, usage, os.Args[0], flagSet())
}
flag.Parse()
fmt.Println("opt1:", *flagOpt1)
fmt.Println("opt2:", *flagOpt2)
fmt.Println("arg1:", *arg1)
}
func flagSet() string {
flagSet := &flag.FlagSet{}
flagSet.SetOutput(bytes.NewBuffer(nil))
flagSet.Bool("opt1", false, "help message for opt1")
flagSet.Int("opt2", 0, "help message for opt2")
flagSet.String("arg1", "", "help message for arg1")
flagSet.PrintDefaults()
return flagSet.Output. String()
}
var (
flagOpt1 = flag.Bool("opt1", false, "help message for opt1")
flagOpt2 = flag.Int("opt2", 0, "help message for opt2")
arg1 = flag.String("arg1", "", "help message for arg1")
)
运行结果如下:
$ go run main.go -opt1 arg1
opt1: true
opt2: 0
arg1: arg1
第二个示例命令行程序是一个简单的计算器,支持两个数字的加减乘除操作,当输入无效的参数时输出自定义的帮助信息。
package main
import (
"flag"
"fmt"
"os"
)
func main() {
flag.Usage = func() {
fmt.Printf("Usage: %s [num1] [num2] [+|-|*|/]\n", os.Args[0])
}
flag.Parse()
args := flag.Args()
if len(args) != 3 {
flag.Usage()
os.Exit(1)
}
num1 := ParseInt(args[0])
num2 := ParseInt(args[1])
switch args[2] {
case "+":
fmt.Println(num1 + num2)
case "-":
fmt.Println(num1 - num2)
case "*":
fmt.Println(num1 * num2)
case "/":
fmt.Println(num1 / num2)
default:
flag.Usage()
os.Exit(1)
}
}
func ParseInt(s string) int {
var n int
_, err := fmt.Sscanf(s, "%d", &n)
if err != nil {
fmt.Printf("%q is not an integer\n", s)
os.Exit(1)
}
return n
}
注意,我们通过 flag.Args()
获取额外的参数,然后使用 switch
语句实现加减乘除运算。
示例的运行结果如下:
$ go run calc.go 5 3 +
8
$ go run calc.go foo 3 +
"foo" is not an integer
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:golang实现命令行程序的使用帮助功能 - Python技术站