網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
命令行參數(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)建自己的命令
原文鏈接:https://www.cnblogs.com/dcz2015/p/11212611.html
相關(guān)推薦
- 2024-01-08 Spring AOP 切面@Around注解的具體使用
- 2022-08-02 Python+Selenium實(shí)現(xiàn)瀏覽器標(biāo)簽頁(yè)的切換_python
- 2022-03-14 workman實(shí)現(xiàn)websocket聊天nginx的配置
- 2022-02-28 Error: clean-webpack-plugin only accepts an option
- 2022-04-12 iOS?block的值捕獲與指針捕獲詳解_IOS
- 2023-11-25 全局后置路由守衛(wèi)(afterEach)
- 2023-07-09 Python Django 零基礎(chǔ)從零到一部署服務(wù),Hello Django!全文件夾目錄和核心代碼
- 2022-11-30 詳解Golang中字符串的使用_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支