Go to Learn Go之命令行參數(shù)

概述

在上一節(jié)的內(nèi)容中,我們介紹了Go的時(shí)間日期,包括:time包、格式化日期、日期字符串解析、計(jì)算日期差、時(shí)區(qū)操作、定時(shí)任務(wù)等。在本節(jié)中,我們將介紹Go的命令行參數(shù)。命令行參數(shù)在程序設(shè)計(jì)中扮演著重要的角色,它允許用戶在運(yùn)行程序時(shí)提供自定義的輸入,以控制程序的行為。Go語(yǔ)言提供了靈活且強(qiáng)大的命令行參數(shù)處理機(jī)制,既可以使用os.Args,也可以使用flag包。

os.Args

os.Args是一個(gè)指向字符串切片的指針,其中第一個(gè)元素是程序的名稱(chēng),后續(xù)元素是用戶提供的命令行參數(shù)。注意:命令行參數(shù)的順序是按照它們?cè)诿钚兄谐霈F(xiàn)的順序排列的,我們可以根據(jù)需要解析和處理這些參數(shù)。

package main

import (
 "fmt"
 "os"
)

func main() {
    // 第一個(gè)元素是程序名稱(chēng)
    fmt.Println(os.Args[0])

    // 從第二個(gè)元素開(kāi)始是命令行參數(shù)
    args := os.Args[1:]

    // 遍歷命令行參數(shù),并打印每個(gè)參數(shù)的值
    for _, arg := range args {
        fmt.Println(arg)
    }
}

flag包

flag包是用于處理命令行參數(shù)的常用包,它提供了一組函數(shù)和類(lèi)型,用于定義和解析命令行標(biāo)志以及操作命令行參數(shù)。flag包的主要功能如下:
定義標(biāo)志:使用flag.FlagSet類(lèi)型和其方法可以定義命令行標(biāo)志。比如:可以使用flag.String("name", "default", "description")定義一個(gè)字符串類(lèi)型的標(biāo)志,并設(shè)置其默認(rèn)值和描述信息。
解析標(biāo)志:通過(guò)調(diào)用flag.Parse()函數(shù),可以將命令行參數(shù)解析為已定義的標(biāo)志。解析后,可以通過(guò)訪問(wèn)標(biāo)志的值來(lái)獲取命令行參數(shù)的值。
命令行參數(shù)訪問(wèn):通過(guò)使用flag.Args()函數(shù),可以獲取命令行參數(shù)中未被解析為標(biāo)志的值。
flag包提供了多種類(lèi)型的標(biāo)志,比如:字符串類(lèi)型(String)、整數(shù)類(lèi)型(Int)、浮點(diǎn)數(shù)類(lèi)型(Float64)、布爾類(lèi)型(Bool)等,可以根據(jù)需要定義不同類(lèi)型的標(biāo)志來(lái)處理不同的命令行參數(shù)。標(biāo)志可以設(shè)置一些選項(xiàng),比如:標(biāo)志的名稱(chēng)、默認(rèn)值、使用信息等,這些選項(xiàng)用于描述標(biāo)志的屬性和行為。
在解析命令行參數(shù)時(shí),flag包會(huì)按照命令行中參數(shù)的順序解析標(biāo)志。第一個(gè)參數(shù)會(huì)被解析為第一個(gè)標(biāo)志的值,第二個(gè)參數(shù)會(huì)被解析為第二個(gè)標(biāo)志的值,以此類(lèi)推。如果某個(gè)參數(shù)沒(méi)有對(duì)應(yīng)的標(biāo)志,那么它會(huì)被忽略。定義的標(biāo)志名稱(chēng)必須是合法的標(biāo)識(shí)符,不能使用無(wú)效的字符或關(guān)鍵字。同時(shí),標(biāo)志名稱(chēng)應(yīng)該是全局唯一的,不能與其他標(biāo)志重名。如果定義標(biāo)志時(shí)出現(xiàn)了錯(cuò)誤,比如:重復(fù)定義了相同的標(biāo)志,或給標(biāo)志設(shè)置了無(wú)效的值,flag包會(huì)返回一個(gè)錯(cuò)誤信息,可以使用錯(cuò)誤處理機(jī)制來(lái)捕獲這些錯(cuò)誤并進(jìn)行適當(dāng)?shù)奶幚怼?br> 命令行參數(shù)可以以不同的格式傳遞,常見(jiàn)的格式包括:?jiǎn)蝹€(gè)參數(shù)(-flagvalue)或多個(gè)參數(shù)(--flagvalue1 value1 --flagvalue2 value2)。
在下面的示例代碼中,我們定義了三個(gè)標(biāo)志和選項(xiàng),分別為:name、age和freshman。其中,name是一個(gè)字符串類(lèi)型的標(biāo)志,有默認(rèn)值"Mike"。age是一個(gè)整數(shù)類(lèi)型的標(biāo)志,有默認(rèn)值18。freshman是一個(gè)布爾類(lèi)型的標(biāo)志,有默認(rèn)值false。
通過(guò)調(diào)用flag.Parse()函數(shù)解析命令行參數(shù)后,我們可以訪問(wèn)標(biāo)志的值來(lái)獲取命令行中傳遞的參數(shù)。在該示例中,我們打印輸出了每個(gè)標(biāo)志的值。另外,我們使用flag.Args()函數(shù)獲取了命令行參數(shù)中未被解析為標(biāo)志的值,并打印出來(lái),這樣就可以同時(shí)處理命令行中的帶標(biāo)志參數(shù)和普通參數(shù)。

package main

import (
 "flag"
 "fmt"
)

func main() {
    // 定義標(biāo)志和選項(xiàng),假設(shè)輸入命令行參數(shù)為:./test.exe --name Jack --age 15 --freshman Hello Hope
    var (
        name = flag.String("name", "Mike", "the name of the student")
        age = flag.Int("age", 18, "the age of the student")
        freshman = flag.Bool("freshman", false, "freshman or not")
    )

    // 解析命令行參數(shù)
    flag.Parse()

    // 訪問(wèn)標(biāo)志的值,輸出:Jack 15 true
    fmt.Println(*name, *age, *freshman)
  
    // 輸出命令行參數(shù)中未被解析為標(biāo)志的值,分別輸出:Arg: Hello Arg: Hope
    for _, arg := range flag.Args() {
        fmt.Println("Arg:", arg)
    }
}

使用flag后,我們可以在命令行窗口中輸入命令./test.exe --help來(lái)打印輸出命令行參數(shù)的幫助信息。

Usage of F:\test.exe:
  -age int
        the age of the student (default 18)
  -freshman
        freshman or not
  -name string
        the name of the student (default "Mike")

到這里,本專(zhuān)欄《Go to Learn Go》的所有內(nèi)容就全部介紹完畢了。希望通過(guò)本專(zhuān)欄,你已經(jīng)學(xué)會(huì)了Go語(yǔ)言的基礎(chǔ)知識(shí),以及常用庫(kù)的使用。

酒酣君去我亦別,后夜山頭望明月。
于道各努力,千里自同風(fēng)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,179評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,628評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,642評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,444評(píng)論 6 405
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,948評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,185評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,717評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,794評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,418評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,671評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,414評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,750評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容