Go语言内置了很是多具备经常使用功能的内置包,它们被称为标准库。我会在博客中以每篇文章一个标准库的方式记录我对标准库的理解和学习笔记。html
今天是第一篇:flag包,这个包是用来作命令行参数解析的。开发者常常会写一些命令行程序,因此参数解析是常见的需求。git
定义参数能够用flag.String()
、flag.Int()
、flag.Int()
等,定义方式有2种:github
// 1. flag.XXX。其中XXX能够是Int、String和Bool等,其结果是相应类型的指针:
var q = flag.Bool("q", false, "Exit") // 至关于 var q *bool
// 2. flag.XXXVar。就是在类型后面加`Var`,实际上是把flag绑定到对应类型的变量上:
var h bool
flag.BoolVar(&h, "h", false, "Show help")
复制代码
定义彻底部参数后能够经过调用flag.Parse()
进行解析。命令行语法有以下三种形式:golang
-flag // 只支持bool类型
-flag=x // 任意类型
-flag x // 只支持非bool类型
复制代码
解析以后,flag的值能够直接使用:若是使用的是flag自身,它们是指针;若是绑定到了某个变量,它们是值:bash
fmt.Println("q is ", *q)
fmt.Println("h is ", h)
复制代码
用一个简单的例子先感觉下:函数
package main
import (
"flag"
"fmt"
"os"
)
var (
n int
h bool
q *bool
s string
)
func init() {
q = flag.Bool("q", false, "Exit")
flag.BoolVar(&h, "h", false, "Show help")
flag.IntVar(&n, "n", 0, "Set number")
flag.StringVar(&s, "s", "Default string", "Set String")
}
func main() {
flag.Parse()
if h {
flag.Usage()
} else {
if *q {
fmt.Println("q is ", *q)
os.Exit(0)
}
fmt.Println("Number is ", n)
fmt.Println("String is ", s)
}
}
复制代码
定义flag一般放在初始化函数init里面,在main函数中首先用flag.Parse
解析参数。而后根据命令行的输入决定怎么显示:post
❯ go run simple.go # 默认输出
Number is 0
String is Default string
❯ go run simple.go -h # 输出帮助信息
Usage of /var/folders/x6/vg82csf90dl3mnnqtbb32d580000gn/T/go-build470860288/b001/exe/simple:
-h Show help
-n int
Set number
-q Exit
-s string
Set String (default "Default string")
❯ go run simple.go -q
q is true
❯ go run simple.go -q false # 错误用法,false没有生效
q is true
❯ go run simple.go -q=false # 正确的用法
Number is 0
String is Default string
❯ go run simple.go -n 10 # 指定n的值
Number is 10
String is Default string
❯ go run simple.go -s abc # 指定s的值
Number is 0
String is abc
❯ go run simple.go -n 10 -s abc # 同时指定n和s的值
Number is 10
String is abc
❯ go run simple.go -n 10 -s abc -q # 程序逻辑中,q为真时直接打印退出了,忽略了另外2个参数
q is true
复制代码
flag在通常的状况下是够用的了。学习
原文地址: strconv.com/posts/flag/ui
完整代码能够在这个地址找到。spa