flag代码包用于接收和解析命令参数。
我们以hello world代码作为示例。
package main
import "fmt"
func main() {
fmt.Println("hello world!")
}
现在,我们想要根据输入定制hello的对象。比如,hello, xiaoming。
flag.StringVar的第一个参数是接收输入值的地址,第二个参数是输入参数的名称,第三个参数是在没有输入参数的时候的默认值,第四个参数是对参数的解释。在使用之前通过flag.Parse()对参数进行解析。
package main
import (
"flag"
"fmt"
)
var name string
func init(){
flag.StringVar(&name, "name", "everyone", "The greeting Object!")
}
func main() {
flag.Parse()
fmt.Printf("hello, %s!\n", name)
}
执行命令
go run demo.go -name="xiaoming"
输出为
hello, xiaoming
进一步,我们可以自定义参数使用说明。
第一种方式是重新定义flag.Usage函数。
第二种方式是重新给flag.CommandLine赋值。
第三种方式是自己创建一个私有的参数容器。
import (
"flag"
"fmt"
"os"
)
var name3 string
//方式三 不使用全局的flag.CommandLine,自己创建一个私有的命令参数容器
var cmdLine = flag.NewFlagSet("question", flag.ExitOnError)
func init(){
//方式二给flag.Commandline重新赋值
//flag.CommandLine = flag.NewFlagSet("", flag.ExitOnError)
//flag.CommandLine.Usage = func(){
// fmt.Fprintf(os.Stderr, "usage of %s:\n", "question")
// flag.PrintDefaults()
//}
//方式三 不使用全局的flag.CommandLine,自己创建一个私有的命令参数容器
cmdLine.StringVar(&name3, "name", "everyone", "the greeting object")
}
func main() {
//方式一 重新定义Usage函数
//flag.Usage = func() {
// fmt.Fprintf(os.Stderr, "Usage of %s:\n", "question")
// flag.PrintDefaults()
//}
//方式三 不使用全局的flag.CommandLine,自己创建一个私有的命令参数容器
cmdLine.Parse(os.Args[1:])
fmt.Printf("hello, %s!\n", name3)
}