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