av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

創(chuàng)新互聯(lián)GO教程:Go語(yǔ)言flag包:命令行參數(shù)解析

在編寫(xiě)命令行程序(工具、server)時(shí),我們有時(shí)需要對(duì)命令參數(shù)進(jìn)行解析,各種編程語(yǔ)言一般都會(huì)提供解析命令行參數(shù)的方法或庫(kù),以方便程序員使用。在Go語(yǔ)言中的 flag 包中,提供了命令行參數(shù)解析的功能。

雙灤ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書(shū)合作)期待與您的合作!

下面我們就來(lái)看一下 flag 包可以做什么,它具有什么樣的能力。

這里介紹幾個(gè)概念:

  • 命令行參數(shù)(或參數(shù)):是指運(yùn)行程序時(shí)提供的參數(shù);
  • 已定義命令行參數(shù):是指程序中通過(guò) flag.Type 這種形式定義了的參數(shù);
  • 非 flag(non-flag)命令行參數(shù)(或保留的命令行參數(shù)):可以簡(jiǎn)單理解為 flag 包不能解析的參數(shù)。

flag 包概述

Go語(yǔ)言內(nèi)置的 flag 包實(shí)現(xiàn)了命令行參數(shù)的解析,flag 包使得開(kāi)發(fā)命令行工具更為簡(jiǎn)單。若要使用 flag 包,首先需要使用 import 關(guān)鍵字導(dǎo)入 flag 包,如下所示:

import "flag"

flag 參數(shù)類(lèi)型

flag 包支持的命令行參數(shù)類(lèi)型有 bool、int、int64、uint、uint64、float、float64、string、duration,如下表所示:

flag 參數(shù) 有效值
字符串 flag 合法字符串
整數(shù) flag 1234、0664、0x1234 等類(lèi)型,也可以是負(fù)數(shù)
浮點(diǎn)數(shù) flag 合法浮點(diǎn)數(shù)
bool 類(lèi)型 flag 1、0、t、f、T、F、true、false、TRUE、FALSE、True、False
時(shí)間段 flag 任何合法的時(shí)間段字符串,如“300ms”、“-1.5h”、“2h45m”,
合法的單位有“ns”、“us”、“μs”、“ms”、“s”、“m”、“h”

flag 包基本使用

有以下兩種常用的定義命令行 flag 參數(shù)的方法:

1) flag.Type()

基本格式如下:

flag.Type(flag 名, 默認(rèn)值, 幫助信息) *Type

Type 可以是 Int、String、Bool 等,返回值為一個(gè)相應(yīng)類(lèi)型的指針,例如我們要定義姓名、年齡、婚否三個(gè)命令行參數(shù),我們可以按如下方式定義:

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

需要注意的是,此時(shí) name、age、married、delay 均為對(duì)應(yīng)類(lèi)型的指針。

2) flag.TypeVar()

基本格式如下:

flag.TypeVar(Type 指針, flag 名, 默認(rèn)值, 幫助信息)

TypeVar 可以是 IntVar、StringVar、BoolVar 等,其功能為將 flag 綁定到一個(gè)變量上,例如我們要定義姓名、年齡、婚否三個(gè)命令行參數(shù),我們可以按如下方式定義:

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, "時(shí)間間隔")

flag.Parse()

通過(guò)以上兩種方法定義好命令行 flag 參數(shù)后,需要通過(guò)調(diào)用 flag.Parse() 來(lái)對(duì)命令行參數(shù)進(jìn)行解析。

支持的命令行參數(shù)格式有以下幾種:

  • -flag:只支持 bool 類(lèi)型;
  • -flag=x;
  • -flag x:只支持非 bool 類(lèi)型。

其中,布爾類(lèi)型的參數(shù)必須使用等號(hào)的方式指定。

flag 包的其他函數(shù):

flag.Args()  //返回命令行參數(shù)后的其他參數(shù),以 []string 類(lèi)型
flag.NArg()  //返回命令行參數(shù)后的其他參數(shù)個(gè)數(shù)
flag.NFlag() //返回使用的命令行參 數(shù)個(gè)數(shù)

結(jié)合上面的介紹知識(shí),我們來(lái)看一個(gè)實(shí)例,代碼如下:

package main

import (
    "flag"
    "fmt"
)

var Input_pstrName = flag.String("name", "gerry", "input ur name")
var Input_piAge = flag.Int("age", 20, "input ur age")
var Input_flagvar int

func Init() {
    flag.IntVar(&Input_flagvar, "flagname", 1234, "help message for flagname")
}

func main() {
    Init()
    flag.Parse()

    // After parsing, the arguments after the flag are available as the slice flag.Args() or individually as flag.Arg(i). The arguments are indexed from 0 through flag.NArg()-1
    // Args returns the non-flag command-line arguments
    // NArg is the number of arguments remaining after flags have been processed
    fmt.Printf("args=%s, num=%d\n", flag.Args(), flag.NArg())
    for i := 0; i != flag.NArg(); i++ {
        fmt.Printf("arg[%d]=%s\n", i, flag.Arg(i))
    }

    fmt.Println("name=", *Input_pstrName)
    fmt.Println("age=", *Input_piAge)
    fmt.Println("flagname=", Input_flagvar)
}

運(yùn)行結(jié)果如下:

go run main.go -name "aaa" -age=123 -flagname=999
args=[], num=0
name= aaa
age= 123
flagname= 999

自定義 Value

另外,我們還可以創(chuàng)建自定義 flag,只要實(shí)現(xiàn) flag.Value 接口即可(要求 receiver 是指針類(lèi)型),這時(shí)候可以通過(guò)如下方式定義該 flag:

flag.Var(&flagVal, "name", "help message for flagname")

【示例】解析喜歡的編程語(yǔ)言,并直接解析到 slice 中,我們可以定義如下 sliceValue 類(lèi)型,然后實(shí)現(xiàn) Value 接口:

package main

import (
    "flag"
    "fmt"
    "strings"
)

//定義一個(gè)類(lèi)型,用于增加該類(lèi)型方法
type sliceValue []string

//new一個(gè)存放命令行參數(shù)值的slice
func newSliceValue(vals []string, p *[]string) *sliceValue {
    *p = vals
    return (*sliceValue)(p)
}

/*
Value接口:
type Value interface {
    String() string
    Set(string) error
}
實(shí)現(xiàn)flag包中的Value接口,將命令行接收到的值用,分隔存到slice里
*/
func (s *sliceValue) Set(val string) error {
    *s = sliceValue(strings.Split(val, ","))
    return nil
}

//flag為slice的默認(rèn)值default is me,和return返回值沒(méi)有關(guān)系
func (s *sliceValue) String() string {
    *s = sliceValue(strings.Split("default is me", ","))
    return "It's none of my business"
}

/*
可執(zhí)行文件名 -slice="java,go"  最后將輸出[java,go]
可執(zhí)行文件名 最后將輸出[default is me]
*/
func main(){
    var languages []string
    flag.Var(newSliceValue([]string{}, &languages), "slice", "I like programming `languages`")
    flag.Parse()

    //打印結(jié)果slice接收到的值
    fmt.Println(languages)
}

通過(guò)
-slice go,php 這樣的形式傳遞參數(shù),languages 得到的就是 [go, php],如果不加
-slice 參數(shù)則打印默認(rèn)值
[default is me],如下所示:

go run main.go -slice go,php,java
[go php java]

flag 中對(duì) Duration 這種非基本類(lèi)型的支持,使用的就是類(lèi)似這樣的方式,即同樣實(shí)現(xiàn)了 Value 接口。


網(wǎng)站題目:創(chuàng)新互聯(lián)GO教程:Go語(yǔ)言flag包:命令行參數(shù)解析
本文網(wǎng)址:http://uogjgqi.cn/article/cdsides.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流