網頁

2016年11月21日 星期一

[Go教學] 控制台程式參數

有一段時間沒發新的文章了(汗

前陣子用go做了一個zfs的備份工具—zbackup
這個工具是所謂的控制台應用程式(console application),所謂的控制台應用程式就是在terminal (linux) 或是 cmd (windows) 運作的應用程式,這樣的程式是可以在啟動的時候輸入參數的,那麼用go如何讀取外面來的參數呢??

比較簡單的方法就是使用args
但我後來發現另一個更方便的package—flag

這次就來介紹這兩種讀取參數的方法吧~


Args



我們可以使用Args來得到下命令時帶的參數,那麼到底Args是什麼勒?
Args是一個陣列包含在命令列輸入的所有字串

舉例來說:
./test penguin monkey
當在命令列輸入上述的指令,此時
Args[0] = ./test
Args[1] = penguin
Args[2] = monkey
len(Args) = 3

Args是包含在package os中的其中一個變數,所以要使用前必須先引入os

以下是一個範例,範例會把在args裡面所有的值依序列出來



看看執行結果
2016-11-22 01-03-29 的螢幕擷圖.png
其中編號0指的就是運行的程式
試試看如果先編譯程執行檔會怎麼樣??
2016-11-22 01-04-05 的螢幕擷圖.png

Q: 在使用c/c++的時候還有一個argc代表參數的個數,go怎麼沒有??
A: 只要使用len(os.Argv)就可以得到argc囉OwO


Flag



flag是go內建的一個package,它會將外部的參數依照"flag"來分類
那麼flag是什麼??和參數的差別是??

舉個例子吧 :
go build example.go -o ex.out
這是將example.go編譯程執行檔,並將執行檔名稱設為ex.out的指令
其中要執行的程式是 go
參數是 build example.go -o ex.out
我們稱 build 以及 -o 為flag,也就是標誌出動作的參數
而 example.go 以及 ex.out 就是flag帶的參數

有了flag的區別以後就可以很簡單的看出這段指令要執行什麼~

flag的使用方法就舉個例子吧~


首先要引入"flag"
接著要先定義所有的flag
在flag的package中有很多種不同的型態可以定義,這邊以flag.Int()為例
  • num為傳回的值,型態為int的指標
  • 第一個參數 "num" 代表使用的時候要用的flag名稱
  • 第二個參數 0 代表要給這個flag的預設值,也就是在沒有被呼叫的時候它的初始值
  • 第三個參數 "try int flag" 代表的是這個flag的解釋,在命令列下--help就可以看到說明頁面

在定義完flag以後要使用 flag.Parse() 這樣才會將參數的內容帶入到定義好的flag中
最後要使用的時候只要 *num 就可以得到值囉~

Q: 如果想要知道不是flag的參數要怎麼辦??
A: 在flag中有提供一個很方便的函式 flag.Args() ,它會回傳一個string陣列,就跟os.Args一樣,但是flag.Args()會去掉執行的程式,flag以及flag參數

講這麼多還不如看看實際執行的情況吧~
首先是 go run flag.go --help
可以看到之前寫在第三個參數的解釋
2016-11-22 12-38-07 的螢幕擷圖.png

接下來試試看都不輸入flag
go run flag.go  apple banana
兩個flag在未呼叫的時候有剛剛設定的初始值
而apple banana兩個參數的編號分別是0,1 並非args的1,2
2016-11-22 12-41-17 的螢幕擷圖.png

再來帶入flag試試看
這邊說明一下,flag的用法可以有4種
  • --num 4
  • -num 4
  • --num=4
  • -num=4
另外這邊只有num需要加入其他參數,boo則不需要,當有呼叫時boo為true,沒呼叫就是false
2016-11-22 12-46-54 的螢幕擷圖.png



以上就是args以及flag的基本用法,如果要寫console application的話使用flag就會變得非常簡單,不需要分析args裡面的東西就可以使用


如果對於上述內容有任何疑問或是我有寫錯的地方都歡迎聯絡我或是在底下留言OwO

沒有留言:

張貼留言