Go語言標準庫 - flag(命令行參數解析)

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

延伸閱讀

  1. golang.org/pkg/flag/
  2. books.studygolang.com/The-Golang-…
相關文章
相關標籤/搜索