Go語(yǔ)言中使用urfave/cli命令行框架
命令行參數(shù)處理以及urfave/cli使用
1.通過(guò)Os.Args獲取cli的參數(shù)
package main
import (
"fmt"
"os"
)
func main() {
if(len(os.Args) > 1) {
for _,value := range os.Args{
fmt.Printf( "%v\n",value)
}
return
}
fmt.Printf( "%s","沒(méi)輸入?yún)?shù)")
}2. 增加命令行選項(xiàng)
我們經(jīng)常能看到 使用一些命令行會(huì)有很多選項(xiàng)。例如 ls -l 等
可以使用flag包來(lái)獲取選項(xiàng),例如下面的代碼:
package main
import (
"flag"
"fmt"
)
var recusive bool
var test string
var level int
func init() {
flag.BoolVar(&recusive, "r", false, "Recusive xxxx")
flag.StringVar(&test, "t", "Default String", "string option")
flag.IntVar(&level, "l", 1, "level of xxxx")
flag.Parse()
}
func main() {
fmt.Println("recusive:", recusive)
fmt.Println("test:", test)
fmt.Println("level:", level)
}init函數(shù)內(nèi)部使用了flag包中的BoolVar、StringVar以及IntVar等方法,標(biāo)記了命令的選項(xiàng)。
// StringVar defines a string flag with specified name, default value, and usage string.
// The argument p points to a string variable in which to store the value of the flag.
func StringVar(p *string, name string, value string, usage string) {
CommandLine.Var(newStringValue(value, p), name, usage)
}像源碼中描述那樣,第一個(gè)參數(shù)用來(lái)接收輸入的參數(shù)值,第二個(gè)用來(lái)定義參數(shù)名稱(chēng)(-l -r 等),第三個(gè)是默認(rèn)參數(shù)、第四個(gè)是使用方法。
于是像上面的代碼我們就可以這樣使用:這里BoolVar的默認(rèn)值是false, -r后面不增加其他參數(shù),不用 -r true 這樣。

3.urfave/cli的簡(jiǎn)單使用
urfave/cli是一個(gè)命令行的框架。舉例說(shuō)明:
package main
import (
"fmt"
"os"
"github.com/urfave/cli" //必須使用這個(gè)包
)
func main() {
//定義兩個(gè)變量用于接收控制臺(tái)輸入的值
var stringValue string
var boolValue bool
//new一個(gè)app出來(lái),就是我們的命令行程序
app := cli.NewApp()
app.Name = "TestCliApp" //起個(gè)名稱(chēng)
app.Usage = "Test" //描述一下用途
app.Version = "2.0.0" //設(shè)置一下版本號(hào)
//重點(diǎn)可以設(shè)置一些選項(xiàng)操作
//第一個(gè)是一個(gè)字符串的選項(xiàng),第二個(gè)是一個(gè)布爾的選項(xiàng)
app.Flags = []cli.Flag{
cli.StringFlag{
Name: "StringOption,s",
Value: "DefaultValue",
Usage: "Display a string value",
Destination: &stringValue,
},
cli.BoolFlag{
Name: "BoolOption,b",
Usage: "Display a bool value",
Destination: &boolValue,
},
}
//定義我們命令行程序主要的工作
app.Action = func(c *cli.Context) error {
if c.NArg() > 0 {
cmds := c.Args()
for index, v := range cmds {
fmt.Printf("args[%d]=%v\t", index, v)
}
} else {
fmt.Println("No Args")
}
fmt.Println("stringOption", stringValue)
fmt.Println("boolOption", boolValue)
return nil
}
//執(zhí)行程序
app.Run(os.Args)
}有幾個(gè)點(diǎn):
- 1.定義Flag的時(shí)候,Name可以用【,】分割,前面長(zhǎng)的 可以用 --XXXX 來(lái)增加參數(shù),后面則是短名 -x 來(lái)表示
- 2.默認(rèn)會(huì)有help和version兩個(gè)選項(xiàng)
- 3.我在使用的時(shí)候發(fā)現(xiàn),當(dāng)輸入正常的 -b -s Hello 這樣的選項(xiàng)的時(shí)候,C.NArg()返回的值是0,而輸出錯(cuò)誤的參數(shù)列表的時(shí)候,則是有值存在的。
我們可以用 -h (--help)查看一下生成的文檔

可以參考具體的文檔來(lái)構(gòu)建自己的命令
到此這篇關(guān)于Go語(yǔ)言中使用urfave/cli命令行框架的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Go語(yǔ)言使用釘釘機(jī)器人推送消息的實(shí)現(xiàn)示例
本文主要介紹了Go語(yǔ)言使用釘釘機(jī)器人推送消息的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Go?chassis云原生微服務(wù)開(kāi)發(fā)框架應(yīng)用編程實(shí)戰(zhàn)
這篇文章主要為大家介紹了Go?chassis云原生微服務(wù)開(kāi)發(fā)框架應(yīng)用編程實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
在go文件服務(wù)器加入http.StripPrefix的用途介紹
這篇文章主要介紹了在go文件服務(wù)器加入http.StripPrefix的用途介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
golang?run時(shí)報(bào)undefined錯(cuò)誤的解決
這篇文章主要介紹了golang?run時(shí)報(bào)undefined錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
Go語(yǔ)言基礎(chǔ)學(xué)習(xí)之?dāng)?shù)組的使用詳解
數(shù)組相必大家都很熟悉,各大語(yǔ)言也都有數(shù)組的身影。Go 語(yǔ)言也提供了數(shù)組類(lèi)型的數(shù)據(jù)結(jié)構(gòu)。本文就來(lái)通過(guò)一些簡(jiǎn)單的示例帶大家了解一下Go語(yǔ)言中數(shù)組的使用,希望對(duì)大家有所幫助2022-12-12
Go語(yǔ)言實(shí)現(xiàn)基于websocket瀏覽器通知功能
這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)基于websocket瀏覽器通知功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07

