Go語言標準庫之flag

更新、更全的《Go從入門到放棄》的更新網站,更有python、go、人工智能教學等着你:http://www.javashuo.com/article/p-mxrjjcnn-hn.htmlpython

Go語言內置的flag包實現了命令行參數的解析,flag包使得開發命令行工具更爲簡單。golang

1、os.Args

若是你只是簡單的想要獲取命令行參數,能夠像下面的代碼示例同樣使用os.Args來獲取命令行參數。bash

package main

import (
    "fmt"
    "os"
)

//os.Args demo
func main() {
    //os.Args是一個[]string
    if len(os.Args) > 0 {
        for index, arg := range os.Args {
            fmt.Printf("args[%d]=%v\n", index, arg)
        }
    }
}

將上面的代碼執行go build -o "args_demo"編譯以後,執行:函數

$ ./args_demo a b c d
args[0]=./args_demo
args[1]=a
args[2]=b
args[3]=c
args[4]=d

os.Args是一個存儲命令行參數的字符串切片,它的第一個元素是執行文件的名稱。工具

2、flag包基本使用

本文介紹了flag包的經常使用函數和基本用法,更詳細的內容請查看官方文檔網站

3、導入flag包

import flag

4、flag參數類型

flag包支持的命令行參數類型有boolintint64uintuint64float float64stringdurationui

flag參數 有效值
字符串flag 合法字符串
整數flag 123四、066四、0x1234等類型,也能夠是負數。
浮點數flag 合法浮點數
bool類型flag 1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False。
時間段flag 任何合法的時間段字符串。如」300ms」、」-1.5h」、」2h45m」。
合法的單位有」ns」、」us」 /「µs」、」ms」、」s」、」m」、」h」。

5、定義命令行flag參數

有如下兩種經常使用的定義命令行flag參數的方法。人工智能

5.1 flag.Type()

基本格式以下:命令行

flag.Type(flag名, 默認值, 幫助信息)*Type 例如咱們要定義姓名、年齡、婚否三個命令行參數,咱們能夠按以下方式定義:

name := flag.String("name", "張三", "姓名")
age := flag.Int("age", 18, "年齡")
married := flag.Bool("married", false, "婚否")
delay := flag.Duration("d", 0, "時間間隔")

須要注意的是,此時nameagemarrieddelay均爲對應類型的指針。

5.2 flag.TypeVar()

基本格式以下: flag.TypeVar(Type指針, flag名, 默認值, 幫助信息) 例如咱們要定義姓名、年齡、婚否三個命令行參數,咱們能夠按以下方式定義:

var name string
var age int
var married bool
var delay time.Duration
flag.StringVar(&name, "name", "張三", "姓名")
flag.IntVar(&age, "age", 18, "年齡")
flag.BoolVar(&married, "married", false, "婚否")
flag.DurationVar(&delay, "d", 0, "時間間隔")

6、flag.Parse()

經過以上兩種方法定義好命令行flag參數後,須要經過調用flag.Parse()來對命令行參數進行解析。

支持的命令行參數格式有如下幾種:

  • -flag xxx (使用空格,一個-符號)
  • --flag xxx (使用空格,兩個-符號)
  • -flag=xxx (使用等號,一個-符號)
  • --flag=xxx (使用等號,兩個-符號)

其中,布爾類型的參數必須使用等號的方式指定。

Flag解析在第一個非flag參數(單個」-「不是flag參數)以前中止,或者在終止符」–「以後中止。

7、flag其餘函數

flag.Args()  ////返回命令行參數後的其餘參數,以[]string類型
flag.NArg()  //返回命令行參數後的其餘參數個數
flag.NFlag() //返回使用的命令行參數個數

8、完整示例

8.1 定義

func main() {
    //定義命令行參數方式1
    var name string
    var age int
    var married bool
    var delay time.Duration
    flag.StringVar(&name, "name", "張三", "姓名")
    flag.IntVar(&age, "age", 18, "年齡")
    flag.BoolVar(&married, "married", false, "婚否")
    flag.DurationVar(&delay, "d", 0, "延遲的時間間隔")

    //解析命令行參數
    flag.Parse()
    fmt.Println(name, age, married, delay)
    //返回命令行參數後的其餘參數
    fmt.Println(flag.Args())
    //返回命令行參數後的其餘參數個數
    fmt.Println(flag.NArg())
    //返回使用的命令行參數個數
    fmt.Println(flag.NFlag())
}

8.2 使用

命令行參數使用提示:

$ ./flag_demo -help
Usage of ./flag_demo:
  -age int
        年齡 (default 18)
  -d duration
        時間間隔
  -married
        婚否
  -name string
        姓名 (default "張三")

正常使用命令行flag參數:

$ ./flag_demo -name 沙河娜扎 --age 28 -married=false -d=1h30m
沙河娜扎 28 false 1h30m0s
[]
0
4

使用非flag命令行參數:

$ ./flag_demo a b c
張三 18 false 0s
[a b c]
3
0
相關文章
相關標籤/搜索